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

rand()

OR:

rand() * rand()

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


编辑:

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


当前回答

两者都不是“更随机”的。

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, ...

这两种方法将始终为同一种子生成相同的数字列表,因此预言者同样可以预测。但是如果你看一下两个调用相乘的结果,你会发现它们都在0.3以下,尽管在原始序列中分布良好。由于两个分数相乘的影响,这些数字是有偏差的。由此产生的数字总是较小,因此更可能发生碰撞,尽管仍然无法预测。

其他回答

只是一个澄清

尽管每当你试图发现伪随机变量或其乘法的随机性时,前面的答案都是正确的,但你应该知道,虽然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出色的撕裂功能

我猜这两种方法都是随机的,尽管我的直觉会说rand()*rand(()不那么随机,因为它会产生更多的零。一旦一个rand()为0,总数即为0

这不是很明显,但rand()通常比rand(*rand)更随机。重要的是,对于大多数用途来说,这实际上不是很重要。

但首先,它们产生了不同的分布。如果这是你想要的,这不是问题,但这很重要。如果你需要一个特定的分布,那么忽略整个“哪个更随机”的问题。那么为什么rand()更随机呢?

rand()之所以更随机(假设它产生的是[0..1]范围内的浮点随机数,这是非常常见的)的核心是,当你将两个FP数与尾数中的大量信息相乘时,你会在结尾处丢失一些信息;IEEE双精度浮点中没有足够的位来保存从[0..1]中均匀随机选择的两个IEEE双精度浮点数中的所有信息,这些额外的信息位将丢失。当然,这无关紧要,因为你(可能)不会使用这些信息,但损失是真实的。您产生哪种分布(即,使用哪种操作进行组合)也并不重要。这些随机数中的每一个都有(最多)52位随机信息——这就是IEEE双精度的容量——如果你将两个或多个随机数合并为一个,那么你仍然只能拥有最多52位的随机信息。

大多数随机数的使用甚至没有使用随机源中实际可用的那么多随机性。得到一个好的PRNG,不要太担心它。(“好”的程度取决于你在用它做什么;你在做蒙特卡洛模拟或密码学时必须小心,否则你可能会使用标准PRNG,因为这通常要快得多。)

当你对随机数的组合会发生什么感到怀疑时,你可以利用你在统计理论中学到的经验。

在OP的情况下,他想知道X*X=X^2的结果是什么,其中X是沿统一[0,1]分布的随机变量。我们将使用CDF技术,因为它只是一对一映射。

由于X~Uniform[0,1],其cdf为:fX(X)=1我们需要转换Y<-X^2,因此Y=X^2求逆x(y):sqrt(y)=x,这给出了x作为y的函数。接下来,求导数dx/dy:d/dy(sqrt(y))=1/(2sqrt(y)

Y的分布如下:fY(Y)=fX(x(Y))|dx/dy |=1/(2 sqrt(Y)

我们还没有完成,我们必须得到Y的域,因为0<=x<1,0<=x^2<1因此Y在范围[0,1)内。如果你想检查Y的pdf是否真的是pdf,请在域中集成它:从0到1集成1/(2 sqrt(Y)),实际上,它会弹出为1。此外,请注意所述函数的形状看起来像belisarious发布的内容。

至于X1+X2+…+Xn,(其中Xi ~一致[0,1]),我们可以求助于中心极限定理,它适用于存在矩的任何分布。这就是Z检验存在的原因。

用于确定生成的pdf的其他技术包括雅可比变换(这是cdf技术的广义版本)和MGF技术。

编辑:作为澄清,请注意,我所说的是结果转换的分布,而不是其随机性。这实际上是一个单独的讨论。我实际上得到的是(rand())^2。对于rand()*rand((),它要复杂得多,无论如何,这不会导致任何类型的均匀分布。

用更离散的数字来考虑可能会有所帮助。考虑一下要生成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之间的浮点数。