我需要在调用random()方法时更改随机种子吗?

时间:2017-02-28 08:41:54

标签: algorithm random random-seed

每次调用random()方法时我是否需要更改随机种子?

或者应该生成一个随机种子,并且在重新启动程序之前不要更改?

我可以选择哪个更好的随机数?

关于我的计划

我正在开发一个Node.js的扑克计划。我需要使用Math.random()的随机牌。

由于原始Math.random()原始方法不够安全,所以我使用seedrandom包重写了它。

我可以向seedrandom提供随机种子。但我不知道何时更改或需要在程序运行时更改随机种子。

2 个答案:

答案 0 :(得分:0)

使用常量随机种子在开发时非常有用 - 它允许您拥有持续的行为,这意味着每次运行程序时都会出现一个错误。

测试时 - 您可以生成随机种子作为参数,如果程序崩溃则重新创建错误。

在真实世界的应用程序中,您不能拥有恒定的随机种子,因为它会使整个程序不变。在你的扑克游戏中,正在处理的牌将始终是相同的,你可以理解它可能是一个问题。

至于在每次random()调用之前生成一个新的种子,伪随机生成器用于创建尽可能真实的随机变量,真随机意味着一旦获得一系列的随机变量就无法预测下一个数字。以前的数字。所以每次更换种子都没有任何意义。

答案 1 :(得分:0)

所以你问的是随机性安全吗?

在这种情况下,这是完全不同的事情。

使用固定伪随机函数作为随机源总是包含输出可能具有确定性属性的风险,这些属性可被潜在的游戏黑客/骗子利用。例如,经过一些卡片序列,游戏将重复自我等...

您可以采取一些措施来预防或降低风险:

  1. 使用随机生成器

    这种方式最安全,但在大多数情况下都不可用,因为您需要一个真正的随机源(如天线或某些传感器获得白噪声等),这需要非标准硬件,这在大多数机器上都不存在。

    < / LI>
  2. 随时随机化

    所以经过一段时间后尝试随机化你的种子(这就是你要问的)。通常使用一些更好的随机变量来改善随机性,例如使用实时,RDTSC状态等来测量人的响应时间(保持键的持续时间或平均点击率等)。

    这样你应该在经过一些饱和或随机周期之前改变种子,之后可以预测输出的某些属性。

  3. 使用多个伪随机生成器

    如果你有更多的发电机,你可以随机不断地在它们之间切换,甚至降低风险。您还可以使用另一个生成器计算一个生成器的种子。

  4. 非常规随机通话频率

    如果你在每一帧中持续随机调用/转动任何东西,那么你的应用程序将“饱和”或自我重复的概率更高。为了降低风险,您可以添加随机值乘以空随机调用。

  5. 检查随机性是使用2D gfx的好主意。您可以轻松检测模式和饱和度,以便估计随机化的频率。例如,这样的情节见:

    同样使用直方图有助于查看输出的质量。 (定制发电机上的一些种子会导致数量丢失或分配不良)