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

rand()

OR:

rand() * rand()

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


编辑:

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


当前回答

答案将是,这取决于,希望rand()*rand(()比rand)更随机,但如下所示:

两个答案都取决于你的值的位数在大多数情况下,你根据伪随机算法生成(它主要是一个数字生成器,依赖于你的计算机时钟,而不是那么随机)。让你的代码更可读(不要用这种咒语来召唤一些随机的巫毒神)。

好吧,如果你检查上面的任何一个,我建议你使用简单的“rand()”。因为你的代码会更可读(不会问自己为什么要写这个,时间……嗯……超过2秒),易于维护(如果你想用super_rand替换rand函数)。

如果你想要更好的随机性,我建议你从任何提供足够噪声的源(无线电静态)流式传输,然后一个简单的rand()就足够了。

其他回答

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

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

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

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

很容易证明两个随机数之和不一定是随机的。假设你有一个6面骰子。每个数字有1/6的机会出现。现在假设你有2个骰子,并将结果相加。这些总数的分布不是1/12。为什么?因为某些数字比其他数字更多。它们有多个分区。例如,数字2仅是1+1的和,但7可以由3+4、4+3或5+2等组成,因此它出现的机会更大。

因此,在本例中,对随机函数应用变换(在这种情况下为加法)不会使其更随机,或必然保持随机性。在上述骰子的情况下,分布偏向于7,因此随机性较小。

好的,所以我会尝试添加一些值来补充其他答案,说你正在创建和使用一个随机数生成器。

随机数发生器是一种具有多种特性的设备(从非常普遍的意义上讲),可以根据需要进行修改。其中一些(来自我)是:

熵:如香农熵分布:统计分布(泊松、正态等)类型:数字的来源(算法、自然事件、组合等)和应用的算法。效率:执行的速度或复杂性。模式:周期、顺序、运行等。也许还有更多。。。

在这里的大多数答案中,分布是主要的关注点,但通过混合和匹配函数和参数,您可以创建生成随机数的新方法,这些随机数将具有不同的特征,其中一些特征乍一看可能不明显。

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

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以下,尽管在原始序列中分布良好。由于两个分数相乘的影响,这些数字是有偏差的。由此产生的数字总是较小,因此更可能发生碰撞,尽管仍然无法预测。

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