如何用C#生成真正的(非伪)随机数?

Max*_*Max 31 c# algorithm math

我知道Random类可以生成伪随机数,但有没有办法生成真正的随机数?

Nol*_*rin 56

这里的答案有两个主要方面.有一些非常重要的细微之处你应该给予应有的关注......

简单方法(简单实用)

RNGCryptoServiceProvider,这是在BCL的加密API的一部分,应该为你做的工作.它在技术上仍然是生成的伪随机数,但"随机性"的质量要高得多 - 适合加密目的,正如名称所暗示的那样.

还有其他具有高质量伪随机生成器的加密API.诸如梅森捻线机之类的算法非常受欢迎.

将其Random与BCL中的类进行比较,效果明显更好.Random例如,如果您在图表上绘制生成的数字,您应该能够识别模式,这是弱点的强烈迹象.这主要是因为该算法仅使用固定大小的种子查找表.

艰难的道路(高质量的理论随机性)

要生成真正随机的数字,您需要利用一些自然现象,例如核衰变,微观温度波动(CPU温度是一个相对便利的来源),仅举几例.然而,这当然要困难得多,并且需要额外的硬件.我怀疑实际的解决方案(RNGCryptoServiceProvider或者说)应该能够很好地完成这项工作.

现在,请注意,如果您确实需要真正随机的数字,则可以使用Random.org等服务,该服务生成具有非常高的随机性/熵(基于大气噪声)的数字.数据可免费下载.尽管如此,这可能会使您的情况变得不必要地复杂化,尽管它确实为您提供了适合科学研究的数据等等.

最终选择是你的,但至少你现在应该能够做出信息决定,了解各种类型和级别的RNG.

  • 感谢您的提示,我将尝试RNGCryptoServiceProvider.我也可以尝试一些核衰变...... (11认同)
  • 我只是在头版上尝试了那个生成器,然后我得到了25个,然后是43个.两个*完全不相关的数字*,这是多么不可能!?这种惊人的事件让我的脊椎发抖. (5认同)
  • @Nick:我说技术上仅仅因为PRNG通常被称为RNG ......但是,我认为我已经明确区分了这两种类型及其方法. (3认同)
  • @Douglas - 如果你*从不*重复数字,那将是一个低于总随机性的标志. (2认同)

Mik*_*scu 13

简短回答:不能直接使用C#生成TRULY RANDOM NUMBERS(即仅使用纯粹的数学结构).

长(呃)答案:仅通过采用能够产生"随机性"的外部设备,例如白噪声发生器或类似设备,并将该设备的输出捕获为伪随机数发生器(PRG)的种子.那部分可以使用C#完成.

  • @Max:随机性是难以捉摸的事情之一,因为它作为一个概念似乎很简单,但生成它(人工 - 或数学)的任务是非常复杂的,如果不是不可能的话 (2认同)