2012-05-21 111 views
1

我一直在研究perlin腳本,但一直在創建簡單的僞隨機值時遇到了問題。如何從xy座標生成種子

我需要能夠從xy座標創建種子值,但x + y在重複值中存在明顯問題。他們也進入負面空間,所以x^y不起作用。

對不起,如果這已經回答了別的地方,但是我不明白或找不到它。

回答

-1

您需要更好地定義問題才能獲得最佳答案。

如果您的x值和y值相對較小,您可以將它們放入整數的高位和低位部分(即您的語言中的種子是整數),例如,對於32位平臺:

int seed = x < < 16 + y;

如果不允許種子值爲負數(我沒有完全理解您的問題中「負空間」的含義,無論您是指的是地理位置還是種子值),您可以將絕對值種子的價值。

如果你的意思是說座標可以有負值,你最好的行動取決於你是否想要一個座標相同的種子和相反的座標。

+0

對不起,我不太喜歡這樣的措辭。座標進入負空間,種子值可以是任何浮點數或整型。我在Python中使用隨機模塊。我試着用你的建議,它似乎工作,雖然我不完全明白爲什麼。 – josh247

+0

Iv'e完成了將我的腳本擴展爲3維並使用了x << 16 + y << 8 + z。它似乎工作,但由於生成大三插值插值和我的舊PC的複雜性,我不能創建一個足夠大的陣列來清晰地看到。有沒有理由不應該這樣做,如果有的話,是否有另一個可能的非交換操作員可以使用?謝謝您的幫助 – josh247

0

首先取xy的絕對值;那麼x^y將正常工作。隨着時間的推移創建一個僞隨機源的最簡單的方法之一。你可以嘗試在當前系統時間乘以x^y;此方法生成重複種子值的機會極低。

+0

^的問題,如果許多點都接近原點,就是你的隨機種子空間會非常傾斜。也許這是可以接受的。類似於沒有使用^爲具有偏置值的整數集創建散列的背後原因,例如,爲什麼Java的字符串散列函數使用31的冪而不是單個字符的Ascii值。 –

+0

我並不特別理解爲什麼,但與x + y一樣,x^y也似乎在整個二維數組中產生對角線對稱性。 – josh247

+0

@ josh247:這是因爲+和^都是可交換的。交換操作數的順序並獲得相同的結果。看看我的答案,以避免對角線對稱。我的答案中有幾個問題。如果你詳細說明這些,我可以更好地提供幫助。 –

0

如果你知道你有的值的範圍,你可以簡單地將x和y轉換爲填充零的字符串,追加兩個字符串,然後通過散列函數運行結果字符串。

+0

與其他一些替代方法相比,速度很慢。 –

+0

這是我目前正在做的,但覺得它不是那麼高效。 – josh247

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中使用它,但它應該也適用於其他語言,假設seed的參數和rnd的返回值是一個整數。

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); 
    } 
}