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

Algorithm 调用random()方法时需要更改随机种子吗?,algorithm,random,random-seed,Algorithm,Random,Random Seed,每次调用random()方法时是否需要更改随机种子 或者应该生成一个随机种子,并且在重新启动程序之前不进行更改 哪种选择可以得到更好的随机数 关于我的节目 我正在用Node.js开发一个扑克程序。我需要用Math.random()洗牌 由于原始的Math.random()方法不够安全,所以我使用包重写了它 我可以为seedrandom提供一个随机种子。但我不知道何时更改或需要在程序运行时更改随机种子。在开发时使用恒定的随机种子非常有用-它允许您有恒定的行为,这意味着每次运行程序时都会出现错误 测

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

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

哪种选择可以得到更好的随机数

关于我的节目

我正在用
Node.js
开发一个扑克程序。我需要用
Math.random()
洗牌

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


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

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

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

在现实世界的应用程序中,你不能有一个恒定的随机种子,因为它会使整个程序保持恒定。在你的扑克游戏中,所发的牌总是一样的,你可以理解这可能是个问题


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

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

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

在现实世界的应用程序中,你不能有一个恒定的随机种子,因为它会使整个程序保持恒定。在你的扑克游戏中,所发的牌总是一样的,你可以理解这可能是个问题


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

那么你是在问随机性安全性

在这种情况下,情况就完全不同了

使用固定伪随机函数作为随机性源总是存在这样的风险,即输出可能具有确定性特性,可能被游戏的潜在黑客/骗子利用。例如,在一系列的纸牌之后,游戏会自己重复,等等

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

  • 使用随机生成器

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

  • 不时随机化

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

    通过这种方式,您应该在某个饱和或随机周期过去之前更改种子,之后可以预测输出的某些属性

  • 使用多个伪随机生成器

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

  • 非恒定随机呼叫频率

    如果你在每一帧/每一圈中都有不断的随机调用,那么你的应用程序“饱和”或自我重复的概率就更高。为了降低风险,您可以添加随机值乘以空随机调用

  • 使用2D gfx检查随机性是一个好主意。您可以很容易地检测模式和饱和度,这样您就可以估计随机化的频率。此类图的示例见:


    此外,使用直方图有助于查看输出的质量。(自定义生成器上的某些种子可能会导致数字丢失或分发有缺陷)

    那么您是在询问随机性安全性吗

    在这种情况下,情况就完全不同了

    使用固定伪随机函数作为随机性源总是存在这样的风险,即输出可能具有确定性特性,可能被游戏的潜在黑客/骗子利用。例如,在一系列的纸牌之后,游戏会自己重复,等等

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

  • 使用随机生成器

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

  • 不时随机化

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

    通过这种方式,您应该在某个饱和或随机周期过去之前更改种子,之后可以预测输出的某些属性

  • 使用多个伪随机生成器

    如果你有更多的发电机,你可以切换