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

rand()

OR:

rand() * rand()

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


编辑:

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


当前回答

正如其他人所说,简单的简短答案是:不,它不是更随机的,但它确实改变了分布。

假设你在玩骰子游戏。你有一些完全公平的随机骰子。如果在每次掷骰子之前,你先把两个骰子放在一个碗里,摇晃它,随机选一个骰子,然后掷那一个,掷骰子会更随机吗?显然,这不会有什么不同。如果两个骰子都给出了随机数字,那么从两个骰子中随机选择一个不会有任何区别。无论哪种方式,你都会得到一个介于1和6之间的随机数,在足够数量的卷上均匀分布。

我想在现实生活中,如果你怀疑骰子可能不公平,这样的程序可能会有用。例如,如果骰子稍微不平衡,那么一个骰子往往比1/6的时间更频繁地给出1,而另一个骰子则往往异常频繁地给出6,那么在这两个骰子之间随机选择将有助于掩盖偏差。(尽管在这种情况下,1和6仍然比2、3、4和5多。嗯,我想这取决于失衡的性质。)

随机性有很多定义。随机序列的一个定义是,它是由随机过程产生的一系列数字。根据这个定义,如果我掷一个公平骰子5次,得到数字2、4、3、2、5,那就是一个随机序列。如果我再掷同样的骰子5次,得到1,1,1、1,1和1,那么这也是一个随机序列。

一些海报指出,计算机上的随机函数不是真正随机的,而是伪随机的,如果你知道算法和种子,它们是完全可预测的。这是真的,但大多数时候是完全无关的。如果我洗牌,然后一次翻一张,这应该是一个随机系列。如果有人偷看卡片,结果将是完全可预测的,但根据大多数随机性的定义,这并不会减少随机性。如果该系列通过了随机性统计测试,我偷看卡片的事实不会改变这一事实。在实践中,如果我们在赌你猜下一张牌的能力,那么你偷看这些牌的事实是非常重要的。如果我们使用该系列来模拟访问我们网站的访客的菜单选择,以测试系统的性能,那么你偷看的事实将毫无区别。(只要您不修改程序以利用这些知识。)

EDIT

我认为我无法将我对蒙蒂霍尔问题的回应变成评论,所以我会更新我的答案。

对于那些没有阅读Belisarius链接的人来说,其要点是:游戏节目参赛者可以选择3个门。在一个人的背后是有价值的奖品,在其他人的背后是毫无价值的东西。他选了1号门。在揭示它是赢家还是输家之前,主持人打开3号门,揭示它是输家。然后,他给了参赛者切换到2号门的机会。参赛者是否应该这样做?

答案是,他应该改变,这违背了许多人的直觉。他最初选择的获胜者的概率是1/3,而另一个门获胜的概率是2/3。我和许多其他人的直觉一样,最初的直觉是,切换不会有任何好处,赔率刚刚改为50:50。

毕竟,假设有人在主持人打开丢失的门后打开了电视。那个人会看到剩下的两扇紧闭的门。假设他知道游戏的性质,他会说每个门都有1/2的机会隐藏奖品。观众的赔率是1/2:1/2,而参赛者的赔率却是1/3:2/3?

我真的不得不考虑这一点,才能让我的直觉成形。要了解它,请理解,当我们讨论像这样的问题中的概率时,我们的意思是,在给定可用信息的情况下,您分配的概率。对于将奖品放在1号门后面的工作人员来说,奖品在1号门后的概率为100%,而在其他两个门后面的概率为零。

机组成员的赔率与参赛者的赔率不同,因为他知道参赛者不知道的东西,即他把奖品放在了哪个门后面。同样,竞争对手的赔率与观众的赔率不同,因为他知道观众不知道的东西,即他最初选择了哪扇门。这并不是无关紧要的,因为主人选择打开哪扇门并不是随机的。他不会打开选手选的门,也不会打开隐藏奖品的门。如果这是同一扇门,他就有两个选择。如果它们是不同的门,那么只剩下一扇门。

那么我们如何得出1/3和2/3?当参赛者最初选择一扇门时,他有1/3的机会选择获胜者。我认为这是显而易见的。这意味着有2/3的机会,其他门中的一个获胜。如果东道主给他机会在不提供任何额外信息的情况下进行切换,那就不会有任何收获。同样,这应该是显而易见的。但有一种看法是,他有2/3的机会通过换人获胜。但他有两个选择。因此,每一个人只有2/3除以2=1/3的机会成为赢家,这并不比他最初的选择更好。当然,我们已经知道最终结果,这只是以不同的方式计算。

但现在主持人透露,这两个选择中的一个不是赢家。因此,对于他没有选择的门有2/3的机会获胜,他现在知道,2个备选方案中的1个不是。另一个可能是,也可能不是。因此,他不再有2/3除以2。他打开的门为零,关闭的门为2/3。

其他回答

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

使用实现原始多项式的线性反馈移位寄存器(LFSR)。

结果将是一个2^n个伪随机数的序列,即在序列中没有重复,其中n是LFSR中的位数。。。。导致均匀分布。

http://en.wikipedia.org/wiki/Linear_feedback_shift_registerhttp://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

使用基于计算机时钟的微信号的“随机”种子,或者可能是文件系统中一些不断变化的数据的md5结果的子集。

例如,32位LFSR将从给定种子开始按顺序生成2^32个唯一数字(没有2个相同)。序列将始终按照相同的顺序,但对于不同的种子,起点将不同(显然)。因此,如果种子之间可能重复的序列不是问题,那么这可能是一个不错的选择。

我已经使用128位LFSR在硬件模拟器中使用种子生成随机测试,该种子是对不断变化的系统数据的md5结果。

关于“随机性”的一些事情是反直觉的。

假设rand()的平面分布,下面将得到非平面分布:

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

有很多其他方法可以创建特定的偏置曲线。我对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出色的撕裂功能