直观:了解计算机如何生成随机数

优采云 发布时间: 2022-12-12 09:39

  直观:了解计算机如何生成随机数

  关注原创【浪屿飞鱼】(每日更新)

  伪随机数*敏*感*词* (PRNG)

  任何有编程经验的人都知道计算机是确定性机器。如果您提供相同的输入,您将始终获得相同的输出。这就是为什么让计算机随机生成随机数比看起来更复杂的原因。

  随机数用于许多行业,例如密码学、*敏*感*词*和视频游戏。然而,计算机并不是天生随机的。相反,程序员依赖于伪随机数*敏*感*词* (PRNG),它以编程方式从给定的起始值生成新的随机数,称为*敏*感*词*。

  这些算法有其自身的局限性。由于随机数是按程序生成的,如果有人可以识别*敏*感*词*值和使用的 PRNG 算法,他们将能够预测序列中的下一个随机数。这将允许攻击者解密、预测序列中的下一张牌、在视频游戏中作弊等等。

  但是 PRNG 在涉及建模和仿真的情况下仍然非常有用,因为它允许通过使用相同*敏*感*词*初始化随机数*敏*感*词*来“重放”一系列随机事件。

  “真”随机数*敏*感*词* (TRNG)

  在随机性优先的情况下,我们使用“真”随机数*敏*感*词* (TRNG)。与具有任意*敏*感*词*值的 PRNG 不同,TRNG 从其环境/外部数据中选择*敏*感*词*值。

  以下是一些可能的选择:

  只需选择攻击者无法预测的*敏*感*词*即可。然后,该*敏*感*词*值将被传递到一个类似 PRNG 的算法中,该算法将生成一个随机数。

  两种方法之间的实际区别。

  PRNG 比 TRNG 更快,并且 PRNG 的确定性在您想要重放一系列“随机”事件的情况下很有用。

  另外,一些PRNGs计算的随机数本质上是周期性的,有一定的概率,但是现代PRNGs有很好的初始化参数,这个周期可以足够长。

  相比之下,TRNG 比 PRNG 慢,不是确定性的,也不是周期性的。

  线性同余发生器

  实现一个简单的 PRNG。该算法的一种变体称为线性同余*敏*感*词* (LCG) 算法。LCG 以前是使用最多和研究最多的 PRNG 之一 ( )。

  

  这是 LCG 的迭代算法:

  LCG 上的维基百科页面 ( ) 记录了一些常用的模数 m、乘数 a 和增量值 c。对于最优值的建议没有达成共识,因此不同实现的值会有所不同。

  我们一定要注意这些参数的取值。选择错误的值可能会导致创建的周期太短,从而使我们的随机数*敏*感*词*无法使用。

  在下图中,您可以看到参数的微小变化会极大地影响周期长度。

  代码

  此处使用早期 C 语言标准(C90/C99/ANSI C 和 C11)中记录的值。

  一 = 1103515245

  米 = 2³¹

  c = 12345

  无论您选择哪种 PRNG 算法,都应该产生均匀分布的随机数和足够长的时间。

<p>import Foundation

final class LCG{

static func generate(modulus: Int, multiplier: Int, increment: Int, seed: Int) -> Int {

return (multiplier * seed + increment) % modulus

} // Generating 100 random numbers using LCG var seed = 0for _ in 0..

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线