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

rand()

OR:

rand() * rand()

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


编辑:

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


当前回答

我们可以通过使用Kolmogorov复杂性如果数字序列不能被压缩,那么它是我们在这个长度上可以达到的最随机的。。。我知道这种测量更多的是理论上的选择。。。

其他回答

我们可以通过使用Kolmogorov复杂性如果数字序列不能被压缩,那么它是我们在这个长度上可以达到的最随机的。。。我知道这种测量更多的是理论上的选择。。。

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

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

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

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

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

强制性的xkcd。。。

大多数rand()实现都有一定的周期。也就是说,在大量的调用之后,序列会重复。rand()*rand(()的输出序列在一半时间内重复,因此在这个意义上它“不那么随机”。

此外,如果没有仔细的构造,对随机值执行算术往往会导致较少的随机性。上面的一张海报引用了“rand()+rand(()+rand()…”(例如,k倍),这实际上会倾向于rand(返回值范围的平均值的k倍。(这是一种随机行走,步数与平均值对称。)

具体来说,假设rand()函数返回[0,1)范围内的均匀分布随机实数。(是的,这个例子允许无限精度。这不会改变结果。)您没有选择特定的语言,不同的语言可能会做不同的事情,但以下分析适用于对rand()的任何非反常实现的修改。乘积rand()*rand(()也在[0,1)范围内,但不再均匀分布。事实上,乘积在区间[0,1/4)和区间[1/4,1)中的可能性一样大。更多的乘法将使结果进一步趋向于零。这使得结果更可预测。在广义上,更可预测的==更少的随机性。

几乎所有对均匀随机输入的操作序列都是非均匀随机的,从而提高了可预测性。小心的话,我们可以克服这一特性,但这样就可以更容易地在实际需要的范围内生成一个均匀分布的随机数,而不是在算术上浪费时间。

根据您的计算机体系结构,相乘数字最终会得到更小的解决方案范围。

如果您的计算机显示16位数字,rand()将为0.1234567890123乘以第二个rand(),0.1234567890123,将得到0.0152415如果你把实验重复10^14次,你肯定会找到更少的解决方案。