我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
我无法理解这个,哪个更随机?
rand()
OR:
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出色的撕裂功能
其他回答
“随机”与“更随机”有点像问哪个零更为零。
在这种情况下,rand是PRNG,所以不是完全随机的。(事实上,如果种子是已知的,那是完全可以预测的)。将其乘以另一个值,使其不再随机。
真正的加密类型RNG实际上是随机的。通过任何类型的函数运行值都不能增加更多的熵,而且很可能会删除熵,使其不再随机。
没有比这更随机的了。它要么是随机的,要么不是随机的。随机意味着“难以预测”。这并不意味着不确定性。如果random()是随机的,那么random(()和random(*random)都是随机的。就随机性而言,分布是无关紧要的。如果出现不均匀分布,则意味着某些值比其他值更有可能;它们仍然是不可预测的。由于涉及伪随机性,所以这些数字非常具有确定性。然而,在概率模型和模拟中,伪随机性通常是足够的。众所周知,使伪随机数生成器复杂化只会使其难以分析。不太可能提高随机性;它经常导致它无法通过统计测试。随机数的期望财产很重要:重复性和再现性、统计随机性、(通常)均匀分布和大周期是少数几个。关于随机数上的变换:正如有人所说,两个或多个均匀分布的和产生正态分布。这是加法中心极限定理。无论源分布如何,只要所有分布都是独立和相同的,它都适用。乘性中心极限定理表示两个或多个独立且一致分布的随机变量的乘积是对数正态的。其他人创建的图形看起来是指数型的,但实际上是对数正态的。因此random()*random(()是对数正态分布的(尽管它可能不是独立的,因为数字是从同一个流中提取的)。这在某些应用中可能是期望的。然而,通常最好生成一个随机数并将其转换为对数正态分布数。Random()*Random()可能很难分析。
欲了解更多信息,请访问www.performorama.org查阅我的书。这本书正在建设中,但相关材料已经存在。请注意,章节和章节编号可能会随时间而变化。第8章(概率论)——第8.3.1和8.3.3节,第10章(随机数)。
正如其他人已经指出的那样,这个问题很难回答,因为我们每个人的大脑中都有自己的随机性图景。
这就是为什么,我强烈建议您花一些时间阅读本网站,以更好地了解随机性:
http://www.random.org/
回到真正的问题。在这个术语中没有或多或少的随机性:
两者都只是随机出现的!
在这两种情况下-仅rand()或rand(*rand)-情况相同:在几十亿个数字之后,序列将重复(!)。对观察者来说,它似乎是随机的,因为他不知道整个序列,但计算机没有真正的随机源,所以他也不能产生随机性。
天气是随机的吗?我们没有足够的传感器或知识来确定天气是否随机。
答案将是,这取决于,希望rand()*rand(()比rand)更随机,但如下所示:
两个答案都取决于你的值的位数在大多数情况下,你根据伪随机算法生成(它主要是一个数字生成器,依赖于你的计算机时钟,而不是那么随机)。让你的代码更可读(不要用这种咒语来召唤一些随机的巫毒神)。
好吧,如果你检查上面的任何一个,我建议你使用简单的“rand()”。因为你的代码会更可读(不会问自己为什么要写这个,时间……嗯……超过2秒),易于维护(如果你想用super_rand替换rand函数)。
如果你想要更好的随机性,我建议你从任何提供足够噪声的源(无线电静态)流式传输,然后一个简单的rand()就足够了。
使用实现原始多项式的线性反馈移位寄存器(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结果。