我无法理解这个,哪个更随机?
rand()
OR:
rand() * rand()
我发现这是一个真正的脑筋急转弯,你能帮我吗?
编辑:
直觉上,我知道数学上的答案是它们是同样随机的,但我不禁想,如果你在将两者相乘时“运行随机数算法”两次,你会创建比只做一次更随机的东西。
我无法理解这个,哪个更随机?
rand()
OR:
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结果。
其他回答
浮动随机数通常基于一种算法,该算法产生一个介于零和一定范围之间的整数。因此,通过使用rand()*rand((),您实际上是在说int_rand()*int_rand()/rand_max ^2-这意味着您排除了任何素数/rand_max^2。
这显著改变了随机分布。
rand()在大多数系统中都是均匀分布的,如果正确播种,很难预测。除非你有特殊的理由对其进行数学运算(例如,将分布成形为所需的曲线),否则使用该方法。
过度简化以说明一点。
假设随机函数只输出0或1。
random()是(0,1)之一,但random(()*random(是(0,0,0,1)之一
你可以清楚地看到,在第二种情况下,获得0的机会绝不等于获得1的机会。
当我第一次发布这个答案时,我希望尽可能简短,以便阅读它的人一眼就能理解random()和random(*random)之间的区别,但我无法阻止自己回答最初的广告垃圾问题:
哪个更随机?
如果random()、random(()*random()、random()+random(()、(random(+1)/2或任何其他不会导致固定结果的组合具有相同的熵源(或者在伪随机生成器的情况下具有相同的初始状态),那么答案将是它们具有相同的随机性(差异在于它们的分布)。我们可以看到的一个完美的例子是Craps游戏。你得到的数字将是随机的(1,6)+随机的(6,6),我们都知道得到7的几率最高,但这并不意味着掷两个骰子的结果比掷一个骰子的效果更随机。
好的,所以我会尝试添加一些值来补充其他答案,说你正在创建和使用一个随机数生成器。
随机数发生器是一种具有多种特性的设备(从非常普遍的意义上讲),可以根据需要进行修改。其中一些(来自我)是:
熵:如香农熵分布:统计分布(泊松、正态等)类型:数字的来源(算法、自然事件、组合等)和应用的算法。效率:执行的速度或复杂性。模式:周期、顺序、运行等。也许还有更多。。。
在这里的大多数答案中,分布是主要的关注点,但通过混合和匹配函数和参数,您可以创建生成随机数的新方法,这些随机数将具有不同的特征,其中一些特征乍一看可能不明显。
大多数rand()实现都有一定的周期。也就是说,在大量的调用之后,序列会重复。rand()*rand(()的输出序列在一半时间内重复,因此在这个意义上它“不那么随机”。
此外,如果没有仔细的构造,对随机值执行算术往往会导致较少的随机性。上面的一张海报引用了“rand()+rand(()+rand()…”(例如,k倍),这实际上会倾向于rand(返回值范围的平均值的k倍。(这是一种随机行走,步数与平均值对称。)
具体来说,假设rand()函数返回[0,1)范围内的均匀分布随机实数。(是的,这个例子允许无限精度。这不会改变结果。)您没有选择特定的语言,不同的语言可能会做不同的事情,但以下分析适用于对rand()的任何非反常实现的修改。乘积rand()*rand(()也在[0,1)范围内,但不再均匀分布。事实上,乘积在区间[0,1/4)和区间[1/4,1)中的可能性一样大。更多的乘法将使结果进一步趋向于零。这使得结果更可预测。在广义上,更可预测的==更少的随机性。
几乎所有对均匀随机输入的操作序列都是非均匀随机的,从而提高了可预测性。小心的话,我们可以克服这一特性,但这样就可以更容易地在实际需要的范围内生成一个均匀分布的随机数,而不是在算术上浪费时间。
强制性的xkcd。。。