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

rand()

OR:

rand() * rand()

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


编辑:

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


当前回答

事实上,仔细想想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()的平面分布,下面将得到非平面分布:

高偏差:sqrt(rand(范围^2))中间偏差峰值:(rand(range)+rand(range))/2低:偏差:范围-sqrt(rand(范围^2))

有很多其他方法可以创建特定的偏置曲线。我对rand()*rand(()做了一个快速测试,它得到了一个非常非线性的分布。

正如其他人已经指出的那样,这个问题很难回答,因为我们每个人的大脑中都有自己的随机性图景。

这就是为什么,我强烈建议您花一些时间阅读本网站,以更好地了解随机性:

http://www.random.org/

回到真正的问题。在这个术语中没有或多或少的随机性:

两者都只是随机出现的!

在这两种情况下-仅rand()或rand(*rand)-情况相同:在几十亿个数字之后,序列将重复(!)。对观察者来说,它似乎是随机的,因为他不知道整个序列,但计算机没有真正的随机源,所以他也不能产生随机性。

天气是随机的吗?我们没有足够的传感器或知识来确定天气是否随机。

你要寻找的概念是“熵”,即弦的无序程度位。从“最大熵”的概念来看,这个概念最容易理解。

具有最大熵的比特串的一个近似定义是,它不能用更短的比特串来精确表达(即,使用某种算法将较小的字符串扩展回原始字符串)。

最大熵与随机性的相关性源于以下事实:如果你“随机”选择一个数字,你几乎肯定会选择一个其比特串接近于具有最大熵,也就是说,它不能被压缩。这是我们对“随机”数特征的最好理解。

所以,如果你想从两个随机样本中产生一个随机数,它是随机,将两个位字符串连接在一起。实际上,你只是将样本填充到双倍长度单词的高半部分和低半部分。

从更实际的角度来看,如果你发现自己背负着一个蹩脚的rand(),它可以有时有助于将两个样本混合在一起——尽管,如果真的是盈亏平衡的话那个程序没用。

只是一个澄清

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

这里有一个简单的答案。考虑垄断。你掷两个六面骰子(对于喜欢游戏符号的人来说是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。在实践中,这可能无关紧要,但这会形成一个奇怪的图形。)