1

乱数発生器の経験はほとんどありません。C で標準の rand 関数を使用し、パーリン ノイズを使用しました。

しかし今、1つの値を「選択」するだけで、同じ値を再選択すると、ホワイトノイズ(パーリンの滑らかさなどはありません)で満たされた解像度NxNxN(Nはおそらく1e6以上)の立方体が必要です毎回同じ結果。アプリケーションを再起動した場合に結果が同じになるように、シードする必要があります。安全でも何でもなく、人間が考えるだけで値を予測できないように、十分にランダムであってはなりません。本当にコンピューターで解析すれば、予測可能でOKです。

標準の C rand 関数を使用して、シードを設定し、3 次元に対してネストされた for ループを実行し、座標に到達するまで毎回乱数を生成するようなものです。もちろん、それはひどく遅いです。速いものが必要です!

私はインターネットを検索しましたが、同時に多くのことを見つけましたが、何も見つかりませんでした。間違ったキーワードを探しているのかもしれませんが、使用できるものは見つかりませんでした。

誰でも始めるのを手伝ってもらえますか? コード?リンク?アルゴリズムを理解しているかどうかはあまり気にしませんが、実装と使用が簡単で、特に高速であるべきです。

4

1 に答える 1

0

誰も質問に答えられないようなので、私はこれについて調査しており、次の解決策で解決しました。

int pseudoRandom(int &seed)
{
    const int a = 16807; // 7^5
    const int m = 2147483647; // 2^31 - 1
    seed = int(unsigned(seed * a) % m);
    return seed;
}

上記のよく知られたランダム関数を使用します。これは、シェーダー言語に簡単に変換でき、64 ビットの int などに簡単に拡張できる優れた機能です。

ここで、0.0 から ?.? の間のランダムを作成できるようにする必要があります。3次元では、同じベースシードで常に同じ結果が得られるはずなので、すべてのコンポーネントx、y、zの整数部分とベースシードを取得しました。

int seed = baseseed;
pseudoRandom(seed);
pseudoRandom(seed * (int(x) + seed) * (int(y) + seed) * (int(z) + seed);

=> シードは、詳細なランダム グリッドの作成を開始できる値になりました。したがって、32x32x32 のランダム値の詳細が必要な場合は、ここで配列に生成するだけです。より大きな配列が必要な場合は、次のように、同じ手順をもう一度実行して別のレイヤーを生成できます。

pseudoRandom(seed * (int(x * 100) + seed) * (int(y * 100) + seed) * (int(z * 100) + seed);

このようにして、ランダム化の方法を自由に決めることができ、詳細を完全に制御できます。

これで私の問題は解決しました。

于 2012-11-14T08:13:22.063 に答える