如何使用两个种子生成伪随机数发生器(PRNG)的种子?

4
对于我正在制作的游戏,其中太阳系拥有x和y坐标,我想使用这些坐标来随机生成该太阳系的特征。最简单的方法似乎是使用两个种子来初始化一个随机数生成器,即x和y坐标。是否有办法从这两个种子中获得一个可靠的种子,或者是否有一个好的PRNG可以使用两个种子并产生长周期呢?
编辑:我知道可以对这两个数字进行二进制运算,但我正在尝试找到导致最少碰撞的方法?加法和乘法很容易导致碰撞。但异或呢?

我想指出太阳系会有x、y和z坐标。实际上,在太空中没有上下或左右之分,这一切都相对于你当前的视角而言。每个人对自己相对于周围空间的位置都有不同的解释,除非多方在同一艘开启了人工重力的宇宙飞船中共享相同的视角。另一艘宇宙飞船可能是倒置的,而其乘员则认为他们是正立的。或者另一艘宇宙飞船侧着飞行,而其乘员则认为自己也是这样。 - lordleviticus
6个回答

6

为什么不将数字以有意义的方式组合起来来生成你的种子呢?例如,你可以将它们相加,这可能已经足够独特了,或者使用一点乘法将它们堆叠在一起,例如:

seed = (x << 32) + y

1
seed1 ^ seed2

(其中^是按位异或运算符)


1
这不会导致(1,2)输出与(2,1)相同吗? - Nathan Goings

1
一个简单的斐波那契伪随机数生成器使用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

这个生成器非常快,而且提供了出色的均匀分布。希望这可以帮到你。


0
为什么不使用某种超级简单的斐波那契算法或类似算法直接生成十进制坐标。使用两个起始数字作为种子。它不会产生适用于蒙特卡罗或类似场景的随机数,但对于游戏来说应该还可以。我不是程序员或数学家,从未尝试编写任何代码,所以我不能为您编写代码.....
编辑 - 类似 f1 = 某些种子然后 f2 = 某些种子和 G =(sqrt(5) + 1)/ 2之类的东西。
然后是某种循环。 Xn = Xn-1 + Xn-2 mod(G)mod(1)(应该产生介于0和1之间的小数),然后乘以任何数字并取最低有效位
也许为了防止衰减,至少在需要产生数字的时间内...
初始重新播种点,在该点f1和f2将基于生成器自己的输出进行重新播种,这将防止序列能够用闭合表达式描述,因此...
如果计数器=初始重新播种点f1=Xn,f2=Xn-某事。并且...重新播种点设置为天花板Xn *某个倍增器。

所以,当Xn和Xn-something的值相同时,它的周期应该结束,并重新输入到f1和f2中,但至少应该使用数字的位数。

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


0

你想使用坐标的原因是什么?例如,您是否希望始终在相同坐标生成的系统始终与在该特定坐标生成的任何其他系统相同?

我建议使用更经典的方法,即只需使用当前时间进行种子处理,并使用其结果继续生成伪随机数。

如果您坚持要使用坐标,我建议使用串联(正如我认为其他人建议的那样)。至少这样可以确保避免冲突,假设您没有两个系统位于相同的坐标。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接