Iv'eはperlinスクリプトに取り組んでいますが、単純な疑似ランダム値の作成に問題があります。
xy座標からシード値を作成できる必要がありますが、x+yには繰り返し値に関する明らかな問題があります。また、それらは負のスペースに入るので、x^yは機能しません。
これがすでにどこかで答えられているが、私が理解できなかったか、それを見つけることができなかった場合は申し訳ありません。
各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の戻り値が整数であると仮定すると、他の言語でも機能するはずです。
x
とy
最初の両方の絶対値を取ります。その後、x^y
正常に動作します。疑似ランダムソースを作成する最も簡単な方法の1つは、時間の使用です。x^y
現在のシステム時刻を掛けてみてください。この方法では、繰り返しシード値が生成される可能性は非常に低くなります。
値の範囲がわかっている場合は、xとyをゼロが埋め込まれた文字列としてキャストし、2つの文字列を追加して、結果の文字列をハッシュ関数で実行するだけです。
最適な答えを得るには、問題をより適切に定義する必要があります。
x値とy値が比較的小さい場合は、整数の上位部分と下位部分に配置できます(たとえば、32ビットプラットフォームの場合は、整数のシードです)。
intシード=x<< 16 + y;
シード値が負になることが許可されていない場合(地理またはシード値のどちらを参照しているかにかかわらず、質問で「負のスペース」が何を意味するのか完全には理解できませんでした)、シードの絶対値を取得できます。
座標が負の値を持つ可能性があることを意味する場合、最善のアクションは、座標とその逆に同じシードが必要かどうかによって異なります。
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);
}
}