【问题标题】:How do you seed a PRNG with two seeds?如何用两颗种子播种 PRNG?
【发布时间】:2009-09-11 15:34:57
【问题描述】:

对于我正在制作的游戏,其中太阳系具有 x 和 y 坐标,我想使用坐标随机生成该太阳系的特征。最简单的方法似乎是用两个种子(x 和 y 坐标)为随机数生成器播种。有没有办法从两颗种子中得到一颗可靠的种子,或者是否有一个好的 PRNG 需要两颗种子并产生很长的周期?

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

【问题讨论】:

  • 想指出太阳系会有一个 x, y, and , z 坐标。事实上,空间中没有上下、左右之分。这一切都与您当前的观点有关。每个人都会对他们相对于周围空间的位置有不同的解释,除了在同一个航天器中打开人工重力时,多方共享相同的视角。另一艘宇宙飞船可能是颠倒的,而它的乘员认为它们是直立的。或者另一个侧身飞行,它的乘员相信自己和我们一样

标签: random


【解决方案1】:

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

seed = (x << 32) + y

【讨论】:

    【解决方案2】:
    seed1 ^ seed2
    

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

    【讨论】:

      【解决方案3】:

      一个简单的斐波那契 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
      

      这个生成器非常快,并且提供 极好的均匀分布。 希望这可以帮助。

      【讨论】:

        【解决方案4】:

        为什么不使用某种超级简单的斐波那契算术或类似的东西直接以 10 为底生成坐标。使用两个起始数字作为种子。它不会产生适合蒙特卡洛或类似的随机数,但它们应该适合游戏。我不是程序员或数学家,也从未尝试过编写任何代码,因此无法为您编写代码.....

        编辑 - 类似于 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 的值相同时,该周期应该结束 - 某些东西被重新输入 f1 和 f2,至少对于您用于数字的任何位长度都不应该发生这种情况。

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

        【讨论】:

          【解决方案5】:

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

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

          如果您坚持使用坐标,我会建议连接(我相信其他人建议)。假设您没有两个系统处于相同的坐标,那么至少可以保证避免冲突。

          【讨论】:

            【解决方案6】:

            我使用 George Marsaglia 的 PRNG 之一:

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

            它明确依赖于两个种子,所以可能正是您正在寻找的。​​p>

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-06-03
              • 2015-07-23
              • 1970-01-01
              • 2018-12-05
              • 1970-01-01
              • 1970-01-01
              • 2021-11-10
              • 1970-01-01
              相关资源
              最近更新 更多