我想在Java,Python和JavaScript中實現XorShift PRNG。不同的實現必須在給定相同種子的情況下生成完全相同的序列。到目前爲止,我一直無法做到這一點。在Java和Python中實現XorShift相同
我在Java中實現
具有以下實現的XorShift PRNG在Java中(其中x
是long
場):
public long randomLong() {
x ^= (x << 21);
x ^= (x >>> 35);
x ^= (x << 4);
return x;
}
如果我種子x
1,前四致電randomLong()
將生成:
35651601
1130297953386881
-9204155794254196429
144132848981442561
我在Python中的實現
我已經試過有和沒有numpy。以下是使用numpy的版本。
def randomLong(self):
self.x ^= np.left_shift(self.x, 21)
self.x ^= np.right_shift(self.x, 35)
self.x ^= np.left_shift(self.x, 4)
return self.x
使用相同的種子,Python的功能會產生:
35651601
1130297953386881
-9204155787274874573 # different
143006948545953793 # different
我的JavaScript實現
我還沒有嘗試一個呢,因爲JavaScript的唯一的號碼類型似乎是基於IEEE 754的雙打打開了不同的蠕蟲。
我認爲原因是
Java和Python有不同數量的類型。 Java有32位和64位整數,而Python有時髦的大int類型。
看起來換班經營者有不同的語義。例如,在Java中,邏輯和算術移位都有,而在Python中,只有一種移位(邏輯?)。
問題
我將很高興與答案,讓我在這三種語言寫一個PRNG,另外一個是快。它不一定非常好。我曾考慮將C庫實現移植到其他語言,儘管它不是很好。
- 我可以修復我的上述實施,以便他們工作嗎?
- 我應該切換到另一個PRNG函數,它更容易在prog.langs中實現嗎?
我讀過SO,其中有人建議使用Python的java.util.Random類。我不想要這個,因爲我也需要JavaScript中的函數,而且我不知道這個包在那裏存在。
您的XorShift與維基百科上提供的版本不匹配。你在使用哪種變體? – Nayuki
你可以在每次左移之後通過屏蔽獲得Python版本以匹配Java:'self.x^=((self.x << 21)&((1 << 64) - 1))' – Nayuki
@NayukiMinase:我基於它的代碼:http://www.javamex.com/tutorials/random_numbers/xorshift.shtml#.Vo_h15MrJE4 –