伪原创*敏*感*词*(伪随机数*敏*感*词*为什么让计算机偶然生成随机数比看起来复杂的多 )

优采云 发布时间: 2022-01-23 21:12

  伪原创*敏*感*词*(伪随机数*敏*感*词*为什么让计算机偶然生成随机数比看起来复杂的多

)

  更多网络新鲜资讯和工作技巧,关注原创【琅琊飞鱼】(每日更新)

  

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

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

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

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

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

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

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

  以下是一些潜在的选择:

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

  两种方法的实际区别。

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

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

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

  线性同余发生器

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

  这是 LCG 的迭代算法:

  

  LCG 上的维基百科页面 ( ) 记录了一些常用的模数 m、乘数 a 和增量值 c。对于推荐的最佳值没有共识,因此实现之间存在不同的值。

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

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

  

  代码

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

  一个 = 1103515245

  m = 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人工客服


线