1

Iv'eはperlinスクリプトに取り組んでいますが、単純な疑似ランダム値の作成に問題があります。

xy座標からシード値を作成できる必要がありますが、x+yには繰り返し値に関する明らかな問題があります。また、それらは負のスペースに入るので、x^yは機能しません。

これがすでにどこかで答えられているが、私が理解できなかったか、それを見つけることができなかった場合は申し訳ありません。

4

5 に答える 5

1

各x、yペアに繰り返し可能な乱数を割り当てますか?

x、yの線形または一般的な関数の組み合わせをシードとして使用すると、分布にアーティファクトが発生します(少なくとも、非常に複雑な関数を使用しない場合)。これで試してみてください、私はそれが私のために働いたのと同じ問題を抱えています

//seeded random for JS - integer
function irnd2()
{
    a=1664525;
    c=1013904223;
    m=4294967296;
    rnd2.r=(rnd2.r*a+c)%m;
    return rnd2.r;
}

//seeded random for JS - double [0,1]
function rnd2()
{
    a=1664525;
    c=1013904223;
    m=4294967296;
    rnd2.r=(rnd2.r*a+c)%m;
    return rnd2.r/m;
}


rnd2.r=192837463;

//seed function
function seed2(s)
{
    s=s>0?s:-s;
    rnd2.r=192837463^s;
}

//my smart seed from 2 integer
function myseed(x,y)
{
seed2(x);//x is integer
var sx=irnd2();//sx is integer
seed2(y);//y is integer
var sy=irnd2();//sy is integer
seed2(sx^sy);//using binary xor you won't lose information 
}

それを使用するために:

myseed(x,y);
irnd2();

このようにして、相関のない良好なランダムシーケンスを取得できます。

私はJSで使用していますが、シードの引数とrndの戻り値が整数であると仮定すると、他の言語でも機能するはずです。

于 2013-04-01T01:03:29.750 に答える
0

xy最初の両方の絶対値を取ります。その後、x^y正常に動作します。疑似ランダムソースを作成する最も簡単な方法の1つは、時間の使用です。x^y現在のシステム時刻を掛けてみてください。この方法では、繰り返しシード値が生成される可能性は非常に低くなります。

于 2012-05-21T21:53:12.720 に答える
0

値の範囲がわかっている場合は、xとyをゼロが埋め込まれた文字列としてキャストし、2つの文字列を追加して、結果の文字列をハッシュ関数で実行するだけです。

于 2012-05-21T21:53:45.997 に答える
0

最適な答えを得るには、問題をより適切に定義する必要があります。

x値とy値が比較的小さい場合は、整数の上位部分と下位部分に配置できます(たとえば、32ビットプラットフォームの場合は、整数のシードです)。

intシード=x<< 16 + y;

シード値が負になることが許可されていない場合(地理またはシード値のどちらを参照しているかにかかわらず、質問で「負のスペース」が何を意味するのか完全には理解できませんでした)、シードの絶対値を取得できます。

座標が負の値を持つ可能性があることを意味する場合、最善のアクションは、座標とその逆に同じシードが必要かどうかによって異なります。

于 2012-05-21T21:53:56.040 に答える
0

C#では、alexroatの回答から適応および改善されました。設定するだけRandom.seed = MyUtils.GetSeedXY(x, y)で、準備完了です。

public static class MyUtils
{
    static int seed2(int _s)
    {
        var s = 192837463 ^ System.Math.Abs(_s);
        var a = 1664525;
        var c = 1013904223;
        var m = 4294967296;
        return (int) ((s * a + c) % m);
    }

    public static int GetSeedXY(int x, int y)
    {
        int sx = seed2(x * 1947);
        int sy = seed2(y * 2904);
        return seed2(sx ^ sy);
    }
}
于 2016-05-28T11:06:55.580 に答える