我无法理解这个,哪个更随机?

rand()

OR:

rand() * rand()

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


编辑:

直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。


当前回答

大多数这种分布发生是因为你必须限制或规范随机数。

我们将其标准化为全部为正,符合范围,甚至符合指定变量类型的内存大小限制。

换句话说,因为我们必须将随机调用限制在0和X之间(X是变量的大小限制),所以我们将有一组介于0和X的“随机”数。

现在,当你将随机数与另一个随机数相加时,总和将介于0和2X之间。。。这会使值偏离边缘点(当两个随机数在较大范围内时,将两个小数字相加和将两个大数字相加的概率非常小)。

想象一下这样一个例子,你有一个接近于零的数字,你将它与另一个随机数相加,它肯定会变大,远离0(这对于大数字是正确的,因为随机函数不可能两次返回两个大数字(接近于X的数字)。

现在,如果你用负数和正数设置随机方法(跨越零轴),情况将不再如此。

例如,假设RandomReal({-x,x},50000,.01),那么你会得到负数和正数的偶数分布,如果你将随机数相加,它们将保持其“随机性”。

现在我不确定Random()*Random(()从负到正的跨度会发生什么。。。这将是一个有趣的图表。。。但我现在得回去写代码了-P

其他回答

只是一个澄清

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

实例

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

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

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

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

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

另一个例子

当2*Random()均匀分布时:

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

随机()+随机()不是!

        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个均匀分布的随机变量相加,可以看到从均匀分布到正态分布的道路:

Edit

几个学分

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

感谢Heike出色的撕裂功能

过度简化以说明一点。

假设随机函数只输出0或1。

random()是(0,1)之一,但random(()*random(是(0,0,0,1)之一

你可以清楚地看到,在第二种情况下,获得0的机会绝不等于获得1的机会。


当我第一次发布这个答案时,我希望尽可能简短,以便阅读它的人一眼就能理解random()和random(*random)之间的区别,但我无法阻止自己回答最初的广告垃圾问题:

哪个更随机?

如果random()、random(()*random()、random()+random(()、(random(+1)/2或任何其他不会导致固定结果的组合具有相同的熵源(或者在伪随机生成器的情况下具有相同的初始状态),那么答案将是它们具有相同的随机性(差异在于它们的分布)。我们可以看到的一个完美的例子是Craps游戏。你得到的数字将是随机的(1,6)+随机的(6,6),我们都知道得到7的几率最高,但这并不意味着掷两个骰子的结果比掷一个骰子的效果更随机。

“随机”与“更随机”有点像问哪个零更为零。

在这种情况下,rand是PRNG,所以不是完全随机的。(事实上,如果种子是已知的,那是完全可以预测的)。将其乘以另一个值,使其不再随机。

真正的加密类型RNG实际上是随机的。通过任何类型的函数运行值都不能增加更多的熵,而且很可能会删除熵,使其不再随机。

用更离散的数字来考虑可能会有所帮助。考虑一下要生成1到36之间的随机数,所以您决定最简单的方法是投掷两个公平的6面骰子。你得到了这个:

     1    2    3    4    5    6
  -----------------------------
1|   1    2    3    4    5    6
2|   2    4    6    8   10   12
3|   3    6    9   12   15   18
4|   4    8   12   16   20   24   
5|   5   10   15   20   25   30
6|   6   12   18   24   30   36

所以我们有36个数字,但并不是所有数字都得到了公平的表示,有些数字根本没有出现。靠近中心对角线(左下角到右上角)的数字将以最高频率出现。

描述骰子之间不公平分布的相同原则同样适用于0.0和1.0之间的浮点数。

假设你有一个简单的硬币翻转问题,偶数被认为是正面,奇数被认为是反面。逻辑实现是:

rand() mod 2

在足够大的分布范围内,偶数的数量应该等于奇数的数量。

现在考虑一个小小的调整:

rand() * rand() mod 2

如果其中一个结果是偶数,那么整个结果应该是偶数。考虑4种可能的结果(偶*偶=偶,偶*奇=偶,奇*偶=偶数,奇*奇=奇数)。现在,在足够大的分布范围内,答案应该是75%的时间。

如果我是你,我敢打赌。

这条评论实际上更多的是解释为什么不应该基于您的方法实现自定义随机函数,而不是讨论随机性的数学财产。