你如何用两粒种子种植PRNG?

时间:2009-09-11 15:34:57

标签: random

对于我正在制作的游戏,太阳系有x和y坐标,我想使用坐标随机生成该太阳系的特征。最简单的方法是使用两个种子x和y坐标为随机数生成器播种。无论如何从两粒种子中获得一粒可靠的种子,还是有一种好的PRNG需要两粒种子才能长时间生长?

编辑:我知道这两个数字之间的二进制运算,但是我试图找到导致冲突次数最少的方法?加法和乘法很容易导致碰撞。但是XOR呢?

6 个答案:

答案 0 :(得分:7)

为什么不以有意义的方式组合数字来生成种子。例如,你可以添加它们,它们可能足够独特,或者可能使用一点乘法来叠加它们,例如:

seed = (x << 32) + y

答案 1 :(得分:2)

seed1 ^ seed2

(其中^是按位XOR运算符)

答案 2 :(得分:1)

简单的Fibonacci PRNG使用2粒种子 其中一个应该是奇怪的。这台发电机 使用10的幂的模数。 这个时期漫长而且不变 模数的1.5倍;因此对于模数 1000000或10 ^ 6期间为1,500,000。 简单的伪代码是:

Input "Enter power for 10^n modulus";m
Mod& = 10 ^ m
Input "Enter # of iterations"; n
Input "Enter seed #1"; a
Input "Enter seed #2"; b
Loop = 1
For loop = 1 to n
C = a + b
If c > m then c = c - m
A = b
B = c
Next

这台发电机速度非常快 优异的均匀分布。 希望这可以帮助。

答案 3 :(得分:0)

为什么不使用某种超级简单的斐波那契算法或类似的东西直接在基数10中产生坐标。使用两个起始数字作为种子。它不会产生适合蒙特卡罗或类似东西的随机数,但它们应该适合游戏。我不是一个程序员或数学家,从来没有试过任何代码,所以我不能为你做这个......

编辑 - 像f1 =某种种子然后f2 =某种种子而G =(sqrt(5)+ 1)/ 2 ......

然后是某种循环。 Xn = Xn-1 + Xn-2 mod(G)mod(1)(应产生0到1之间的小数)然后乘以任意值并取最低有效数字

并且可能只要需要生成数字就防止腐烂......

初始重播点,f1和f2将根据生成器自身的输出重新接种,这将阻止数字序列能够通过闭合表达式进行描述......

如果counter =初始重播点f1 = Xn且f2 = Xn - 某事。并且...重新设定点设置为上限Xn *某个乘数。

所以当Xn和Xn的相同值被重新输入到f1和f2时,它的周期应该结束,这至少不会发生在你用于数字的位长度上。

....我的意思是,这是我最好的猜测......

答案 4 :(得分:0)

您是否有理由使用坐标?例如,您是否始终希望在同一坐标处生成的系统始终与在该特定坐标处生成的任何其他系统相同?

我建议使用更经典的方法来播种当前时间并使用其结果继续生成伪随机性。

如果你坚持使用坐标,我会建议连接(我相信其他人的建议)。至少那时你可以保证避免碰撞,假设你在同一个合作中没有两个系统。

答案 5 :(得分:0)

我使用了George Marsaglia的PRNG之一:

http://www.math.uni-bielefeld.de/~sillke/ALGORITHMS/random/marsaglia-c

它显然依赖于两个种子,所以可能只是你想要的东西。