对于我正在制作的游戏,其中太阳系拥有x和y坐标,我想使用这些坐标来随机生成该太阳系的特征。最简单的方法似乎是使用两个种子来初始化一个随机数生成器,即x和y坐标。是否有办法从这两个种子中获得一个可靠的种子,或者是否有一个好的PRNG可以使用两个种子并产生长周期呢?
编辑:我知道可以对这两个数字进行二进制运算,但我正在尝试找到导致最少碰撞的方法?加法和乘法很容易导致碰撞。但异或呢?
编辑:我知道可以对这两个数字进行二进制运算,但我正在尝试找到导致最少碰撞的方法?加法和乘法很容易导致碰撞。但异或呢?
为什么不将数字以有意义的方式组合起来来生成你的种子呢?例如,你可以将它们相加,这可能已经足够独特了,或者使用一点乘法将它们堆叠在一起,例如:
seed = (x << 32) + y
seed1 ^ seed2
(其中^
是按位异或运算符)
(1,2)
输出与(2,1)
相同吗? - Nathan GoingsInput "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
这个生成器非常快,而且提供了出色的均匀分布。希望这可以帮到你。
所以,当Xn和Xn-something的值相同时,它的周期应该结束,并重新输入到f1和f2中,但至少应该使用数字的位数。
...我的意思是,这是我最好的猜测...
你想使用坐标的原因是什么?例如,您是否希望始终在相同坐标生成的系统始终与在该特定坐标生成的任何其他系统相同?
我建议使用更经典的方法,即只需使用当前时间进行种子处理,并使用其结果继续生成伪随机数。
如果您坚持要使用坐标,我建议使用串联(正如我认为其他人建议的那样)。至少这样可以确保避免冲突,假设您没有两个系统位于相同的坐标。
我使用George Marsaglia的其中一种伪随机数生成器:
http://www.math.uni-bielefeld.de/~sillke/ALGORITHMS/random/marsaglia-c
它明确依赖于两个种子,所以可能正是你正在寻找的。