协慌网

登录 贡献 社区

理解 “随机性”

我无法理解这一点,这更随机?

rand()

要么

rand() * rand()

我发现它是一个真正的脑筋急转弯,你能帮助我吗?

编辑:

直观地,我知道数学答案将是它们同样随机,但我不禁想到,如果你将两者相乘的话 “运行随机数算法” 两次,你会创造一些比随机更随机的东西它一次。

答案

只是一个澄清

虽然每当您尝试发现伪随机变量或其乘法的随机性时,前面的答案是正确的,但您应该知道,虽然Random()通常是均匀分布的,但Random()* Random()不是。

这是通过伪随机变量模拟的均匀随机分布样本

随机直方图()

BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]

虽然这是在将两个随机变量相乘后得到的分布:

Random()* Random()的直方图

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] * 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

所以,两者都是 “随机的”,但它们的分布是非常不同的。

另一个例子

2 * Random()均匀分布:

直方图2 *随机()

BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]

Random()+ Random()不是!

随机()+随机()的直方图

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

中心极限定理

中心极限定理指出随着项的增加, Random()的总和趋于正态分布

只需四个学期:

随机()+随机()+随机()+随机()的直方图

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
                   Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
                   {50000}],
         0.01]]

在这里,您可以通过将 1,2,4,6,10 和 20 个均匀分布的随机变量相加来看到从均匀分布到正态分布的道路:

添加了不同数量的随机变量的直方图

编辑

一些学分

感谢Thomas Ahle在评论中指出,最后两幅图像中显示的概率分布被称为Irwin-Hall 分布

感谢Heike的精彩撕裂 [] 功能

我猜两种方法都是随机的,虽然我的 gutfeel 会说rand() * rand()随机性较小,因为它会播种更多的零。只要一个rand()0 ,总数就变为0

两者都不是 “更随机”。

rand()根据伪随机种子(通常基于当前时间,总是在变化)生成一组可预测的数字。将序列中的两个连续数字相乘可生成不同但同样可预测的数字序列。

解决这是否会减少碰撞,答案是否定的。它实际上会增加碰撞,因为在0 < n < 1下将两个数相乘。结果将是较小的分数,导致结果偏向光谱的下端。

一些进一步的解释。在下文中,“不可预测的” 和 “随机的” 是指某人根据先前的数字猜测下一个数字的能力,即。一个神谕。

给定种子x ,它生成以下值列表:

0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...

rand()将生成上面的列表,并且rand() * rand()将生成:

0.18, 0.08, 0.08, 0.21, ...

两种方法总是为同一种子生成相同的数字列表,因此可以通过 oracle 同样预测。但是如果你看两个调用相乘的结果,你会看到它们都在0.3之下,尽管在原始序列中分布不错。由于两个分数相乘的影响,数字有偏差。由此产生的数字总是较小,因此尽管仍然是不可预测的,但更可能是碰撞。