2

単一の乱数を生成し、その数値を使用して、理論的に無限に大きい2D平面にブール値をその場でシードできるようにする必要があります。3つの入力(x、y、およびランダムシード)で決定論的であり、疑似ランダム結果を返す、呼び出すことができる関数が必要です。

int r = random()
//...
var value_for_point = f(x,y,r);

この関数を使用して10x10配列を1と0で埋める場合、理想的には、セルごとにランダムな値、つまりホワイトノイズを要求した場合と同じ/類似したように見えます。完璧である必要はありません-統計分析用ではありません。同じ乱数を指定して配列を再作成できる必要があります。

2つの理由から、乱数ジェネレーターを単純にシードすることはできません。まず、この関数がxとyに基づいている必要があります。この関数を呼び出して、(0,0)と(10、10)の間の配列を埋め、後で(-10、-5)と(3,4)の間の値を要求する場合があります。第二に、私が使用している言語にはシード関数がありません。

私が見ていない、これを行うための簡単な方法があるか、フラクタルの領域に私を助けるかもしれない何かがあると確信しています。誰もがこれを行う方法を知っていますか?

4

6 に答える 6

2

パーリンノイズが欲しいと思いますか?

于 2009-10-12T19:51:41.557 に答える
1

100%完璧というわけではありませんが、SHA1やMD5のような定型アルゴリズムを使用するのはどうでしょうか。SHA1は、任意の文字列から160ビットの文字列を出力し、多かれ少なかれランダムです。10x10のブール配列にデータを入力するには、最下位の100ビットのみが必要です。これは、ランダムにかなり近いはずです。シードとして既知のベース文字列(任意の長さ)から開始しているため、値は再現可能です。

使用している言語はわかりませんが、SHA1とMD5の実装は、ほぼすべてのオペレーティングシステムで利用できます。

于 2009-10-12T19:56:32.263 に答える
1

非常に単純な数学的アルゴリズムは、非常に複雑な決定論的出力を生成できます。wolframの本を見てください。

たとえば、ルール30を使用してこれを生成できます。

于 2009-10-12T20:02:36.370 に答える
0

私たちがその言語を知っていれば助けになるかもしれません。

C#..。

static bool GetPixel(int seed, ushort x, ushort y)
{
    int randomSeed = (x << 16 | y) ^ seed;
    Random rnd = new Random(randomSeed); 
    /* if you just want a constant result you can seed the function 
       on app start and never touch the random generator again */
    return rnd.NextDouble() >= .5;
}
于 2009-10-12T19:54:51.440 に答える
0

次のような単純なものを使用するだけです

private static uint GetUint()
{
    m_z = 36969 * (m_z & 65535) + (m_z >> 16);
    m_w = 18000 * (m_w & 65535) + (m_w >> 16);
    return (m_z << 16) + m_w;
}

初期値m_zとm_wをシードします。xとyのそれぞれに対してそれを行います。

于 2009-10-12T19:55:04.530 に答える
0

無限に大きな平面をシミュレートすることはできません。最終的には、ある種の乱数ジェネレーターに悩まされ、ジェネレーターが格納できる状態のビット数には常に制限があります。

とはいえ、制限はほとんど理論的なものです。ほとんどの実用的な目的では、ユーザーが指定できるサイズに基づいて平面のサイズを制限できます。たとえば、xとyが2つの32ビット整数である場合、2 ^ 32-1x2^32-1の平面をシミュレートできる必要があるだけです。これは無限にはるかに短いものです

システムの乱数ジェネレーターについてあなたが言ったことを考えると、おそらくあなたはあなた自身のジェネレーターを書く必要がある(または少なくとも非常に欲しい)か、あるいは十分に長いウェブ上の既存のものを使うでしょう限目。X座標とY座標に32ビットを使用する場合は、少なくとも64ビット周期のジェネレーターが必要です。

そこから、物事は非常に簡単です。線形アドレスを他の2D配列に生成するのと同じように、x、y座標のビットを結合し、その結果をPRNGのシードとして使用して、結果を取得します。

于 2009-10-12T19:59:02.850 に答える