我一直在研究perlin腳本,但一直在創建簡單的僞隨機值時遇到了問題。如何從xy座標生成種子
我需要能夠從xy座標創建種子值,但x + y在重複值中存在明顯問題。他們也進入負面空間,所以x^y不起作用。
對不起,如果這已經回答了別的地方,但是我不明白或找不到它。
我一直在研究perlin腳本,但一直在創建簡單的僞隨機值時遇到了問題。如何從xy座標生成種子
我需要能夠從xy座標創建種子值,但x + y在重複值中存在明顯問題。他們也進入負面空間,所以x^y不起作用。
對不起,如果這已經回答了別的地方,但是我不明白或找不到它。
您需要更好地定義問題才能獲得最佳答案。
如果您的x值和y值相對較小,您可以將它們放入整數的高位和低位部分(即您的語言中的種子是整數),例如,對於32位平臺:
int seed = x < < 16 + y;
如果不允許種子值爲負數(我沒有完全理解您的問題中「負空間」的含義,無論您是指的是地理位置還是種子值),您可以將絕對值種子的價值。
如果你的意思是說座標可以有負值,你最好的行動取決於你是否想要一個座標相同的種子和相反的座標。
首先取x
和y
的絕對值;那麼x^y
將正常工作。隨着時間的推移創建一個僞隨機源的最簡單的方法之一。你可以嘗試在當前系統時間乘以x^y
;此方法生成重複種子值的機會極低。
^的問題,如果許多點都接近原點,就是你的隨機種子空間會非常傾斜。也許這是可以接受的。類似於沒有使用^爲具有偏置值的整數集創建散列的背後原因,例如,爲什麼Java的字符串散列函數使用31的冪而不是單個字符的Ascii值。 –
我並不特別理解爲什麼,但與x + y一樣,x^y也似乎在整個二維數組中產生對角線對稱性。 – josh247
@ josh247:這是因爲+和^都是可交換的。交換操作數的順序並獲得相同的結果。看看我的答案,以避免對角線對稱。我的答案中有幾個問題。如果你詳細說明這些,我可以更好地提供幫助。 –
如果你知道你有的值的範圍,你可以簡單地將x和y轉換爲填充零的字符串,追加兩個字符串,然後通過散列函數運行結果字符串。
與其他一些替代方法相比,速度很慢。 –
這是我目前正在做的,但覺得它不是那麼高效。 – josh247
你想爲每個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中使用它,但它應該也適用於其他語言,假設seed的參數和rnd的返回值是一個整數。
在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);
}
}
對不起,我不太喜歡這樣的措辭。座標進入負空間,種子值可以是任何浮點數或整型。我在Python中使用隨機模塊。我試着用你的建議,它似乎工作,雖然我不完全明白爲什麼。 – josh247
Iv'e完成了將我的腳本擴展爲3維並使用了x << 16 + y << 8 + z。它似乎工作,但由於生成大三插值插值和我的舊PC的複雜性,我不能創建一個足夠大的陣列來清晰地看到。有沒有理由不應該這樣做,如果有的話,是否有另一個可能的非交換操作員可以使用?謝謝您的幫助 – josh247