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

rand()

OR:

rand() * rand()

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


编辑:

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


当前回答

这里有一个简单的答案。考虑垄断。你掷两个六面骰子(对于喜欢游戏符号的人来说是2d6),然后求和。最常见的结果是7,因为有6种可能的方式可以掷7(1,6,5,3,44,3,5,2和6,1)。而2只能在1,1上滚动。很容易看出,掷1d6和掷1d12是不同的,即使范围相同(忽略1d12上可以得到1,点保持不变)。将结果相乘而不是相加会以类似的方式扭曲它们,因为大多数结果都位于范围的中间。如果您试图减少异常值,这是一个好方法,但它无助于使分布均匀。

(奇怪的是,它也会增加低掷。假设你的随机性从0开始,你会看到一个峰值在0,因为它会将其他掷骰变成0。考虑两个介于0和1(包括0和1)之间的随机数,然后相乘。如果其中一个结果为0,则无论其他结果如何,整个结果都将变为0。从中得到1的唯一方法是两卷都是1。在实践中,这可能无关紧要,但这会形成一个奇怪的图形。)

其他回答

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

事实上,仔细想想rand()*rand(()比rand(。原因如下。

基本上,奇数和偶数的数量相同。假设0.04325是奇数,像0.388是偶数,0.4是偶数,0.15是奇数,

这意味着rand()有相等的机会成为偶数或奇数小数。

另一方面,rand()*rand(()的几率有点不同。让我们说:

double a = rand();
double b = rand();
double c = a * b;

a和b都有50%的几率是偶数或奇数。知道这一点

偶数*偶数=偶数偶数*奇数=偶数奇数*奇数=奇数奇数*偶数=偶数

这意味着c有75%的几率是偶数,而只有25%的几率是奇数,这使得rand()*rand(()的值比rand)更可预测,因此随机性更小。

浮动随机数通常基于一种算法,该算法产生一个介于零和一定范围之间的整数。因此,通过使用rand()*rand((),您实际上是在说int_rand()*int_rand()/rand_max ^2-这意味着您排除了任何素数/rand_max^2。

这显著改变了随机分布。

rand()在大多数系统中都是均匀分布的,如果正确播种,很难预测。除非你有特殊的理由对其进行数学运算(例如,将分布成形为所需的曲线),否则使用该方法。

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

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

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

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

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