随机数发生器如何工作?

Rel*_*lla 34 random

随机数发生器如何工作?(例如在C/C++ Java中)

如何编写自己的随机数生成器?(例如在C/C++ Java中)

Bor*_*lik 21

还有这个算法:

在此输入图像描述

哦,更严肃的是:

随机数生成器使用数学公式将数字集转移到另一个数字公式.例如,如果你取一个常数N和另一个数n_0,然后取n mod N(模数运算符)的值,你将得到一个新数字n_1,看起来与它无关n_0.现在,重复相同的过程,n_1你会得到另一个数字.你在这里有一个看似随机数的(很糟糕)发生器.

请记住,我在这里描述的方法是一种玩具方法,不应该用于任何严肃的事情.但是,它确实说明了一般原则.

另请注意:

如果所有科学论文的结果都因为不好而rand被怀疑都会从图书馆的书架上消失,那么每个书架上都会有一个与你的拳头一样大的空隙.

(从数字食谱的第7章开始).对于任何使用随机数生成器进行任何认真工作的人来说,这是必读文本.

  • 这并没有提供问题的答案.要对作者进行批评或要求澄清,请在帖子下方留言. (8认同)

Mic*_*ngh 18

要记住的一件事是没有"真正的"随机数生成器.他们刚刚生成的数字看起来随机给我们凡人.

其中一个最简单的例子(也是实现)是线性同余生成器.当然,这些数字看起来对你和我来说都是不可预测的,但它们实际上是在有限的场内均匀分布的.

当然,像Blum Blum Shub这样的一些发生器即使他将严格的数学技能和计算能力应用于任务也无法预测局外人,但从根本上说,随机数发生器不是随机的; 他们是有规律和可预测的.

  • \dev\random 更加随机,您还可以附加一些东西来测量精确的空气温度或盖革计数器以获得更多随机性。 (2认同)
  • LCG 不一定会在*任何*有限域中产生输出,更不用说均匀分布的数字了。 (2认同)

tho*_*ulb 5

我过去如何制作它们的方法是从系统中获得一些真正快速变化的值,例如系统毫秒计时器.

接下来你需要做的是应用一些公式,从这个"输入"数字生成一个新数字并将其剪切到你需要的范围,例如0..255:

random_number =整数(公式(计时器值))MOD 255

这样,每次调用该函数时都会有一个新的"随机"数字.

一个示例公式函数可以是:
公式(x)=((x XOR常数)+ constant2)MOD范围
XOR曾经是我的最爱之一.


更新:我意识到这个公式非常糟糕,它会生成一组非常可预测的数字.此外,系统计时器太可预测为源.因此对于大多数应用来说,这还不够.如果您需要更好的随机性,请使用更多来源,而不仅仅是系统计时器和更好的公式来组合它们.

  • 毫秒计时器不是一个快速变化的系统,出于大多数计算目的,它是一个半固定的数字,偶尔会改变一次.当它确实发生变化时,它会以完全可预测的方式发生变化.在最好的情况下,时间应该用作种子,并且只能在一段时间内使用,以确保时间在完全再次使用之前已经完全改变.因此,比定时器更好的是一个真正*快速*快速变化且非预测性的系统. (4认同)

Dav*_*vid 2

我找到了这个适用于 Java 的:

http://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml

通过谷歌搜索随机函数如何工作java

我确信答案是特定于语言的,但您可以尝试根据您选择的语言更改我的 Google 查询。