我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
当前回答
关于“随机性”的一些事情是反直觉的。
假设rand()的平面分布,下面将得到非平面分布:
高偏差:sqrt(rand(范围^2))中间偏差峰值:(rand(range)+rand(range))/2低:偏差:范围-sqrt(rand(范围^2))
有很多其他方法可以创建特定的偏置曲线。我对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。
强制性的xkcd。。。
这不是很明显,但rand()通常比rand(*rand)更随机。重要的是,对于大多数用途来说,这实际上不是很重要。
但首先,它们产生了不同的分布。如果这是你想要的,这不是问题,但这很重要。如果你需要一个特定的分布,那么忽略整个“哪个更随机”的问题。那么为什么rand()更随机呢?
rand()之所以更随机(假设它产生的是[0..1]范围内的浮点随机数,这是非常常见的)的核心是,当你将两个FP数与尾数中的大量信息相乘时,你会在结尾处丢失一些信息;IEEE双精度浮点中没有足够的位来保存从[0..1]中均匀随机选择的两个IEEE双精度浮点数中的所有信息,这些额外的信息位将丢失。当然,这无关紧要,因为你(可能)不会使用这些信息,但损失是真实的。您产生哪种分布(即,使用哪种操作进行组合)也并不重要。这些随机数中的每一个都有(最多)52位随机信息——这就是IEEE双精度的容量——如果你将两个或多个随机数合并为一个,那么你仍然只能拥有最多52位的随机信息。
大多数随机数的使用甚至没有使用随机源中实际可用的那么多随机性。得到一个好的PRNG,不要太担心它。(“好”的程度取决于你在用它做什么;你在做蒙特卡洛模拟或密码学时必须小心,否则你可能会使用标准PRNG,因为这通常要快得多。)
当你对随机数的组合会发生什么感到怀疑时,你可以利用你在统计理论中学到的经验。
在OP的情况下,他想知道X*X=X^2的结果是什么,其中X是沿统一[0,1]分布的随机变量。我们将使用CDF技术,因为它只是一对一映射。
由于X~Uniform[0,1],其cdf为:fX(X)=1我们需要转换Y<-X^2,因此Y=X^2求逆x(y):sqrt(y)=x,这给出了x作为y的函数。接下来,求导数dx/dy:d/dy(sqrt(y))=1/(2sqrt(y)
Y的分布如下:fY(Y)=fX(x(Y))|dx/dy |=1/(2 sqrt(Y)
我们还没有完成,我们必须得到Y的域,因为0<=x<1,0<=x^2<1因此Y在范围[0,1)内。如果你想检查Y的pdf是否真的是pdf,请在域中集成它:从0到1集成1/(2 sqrt(Y)),实际上,它会弹出为1。此外,请注意所述函数的形状看起来像belisarious发布的内容。
至于X1+X2+…+Xn,(其中Xi ~一致[0,1]),我们可以求助于中心极限定理,它适用于存在矩的任何分布。这就是Z检验存在的原因。
用于确定生成的pdf的其他技术包括雅可比变换(这是cdf技术的广义版本)和MGF技术。
编辑:作为澄清,请注意,我所说的是结果转换的分布,而不是其随机性。这实际上是一个单独的讨论。我实际上得到的是(rand())^2。对于rand()*rand((),它要复杂得多,无论如何,这不会导致任何类型的均匀分布。
你要寻找的概念是“熵”,即弦的无序程度位。从“最大熵”的概念来看,这个概念最容易理解。
具有最大熵的比特串的一个近似定义是,它不能用更短的比特串来精确表达(即,使用某种算法将较小的字符串扩展回原始字符串)。
最大熵与随机性的相关性源于以下事实:如果你“随机”选择一个数字,你几乎肯定会选择一个其比特串接近于具有最大熵,也就是说,它不能被压缩。这是我们对“随机”数特征的最好理解。
所以,如果你想从两个随机样本中产生一个随机数,它是随机,将两个位字符串连接在一起。实际上,你只是将样本填充到双倍长度单词的高半部分和低半部分。
从更实际的角度来看,如果你发现自己背负着一个蹩脚的rand(),它可以有时有助于将两个样本混合在一起——尽管,如果真的是盈亏平衡的话那个程序没用。