我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
当前回答
关于“随机性”的一些事情是反直觉的。
假设rand()的平面分布,下面将得到非平面分布:
高偏差:sqrt(rand(范围^2))中间偏差峰值:(rand(range)+rand(range))/2低:偏差:范围-sqrt(rand(范围^2))
有很多其他方法可以创建特定的偏置曲线。我对rand()*rand(()做了一个快速测试,它得到了一个非常非线性的分布。
其他回答
我猜这两种方法都是随机的,尽管我的直觉会说rand()*rand(()不那么随机,因为它会产生更多的零。一旦一个rand()为0,总数即为0
过度简化以说明一点。
假设随机函数只输出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的几率最高,但这并不意味着掷两个骰子的结果比掷一个骰子的效果更随机。
这里有一个简单的答案。考虑垄断。你掷两个六面骰子(对于喜欢游戏符号的人来说是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是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之间的浮点数。