math - 理解"randomness"

  显示原文与译文双语对照的内容

我不能让我的头脑,这更像是随机的?

 
rand()

 

或者

 
rand() * rand()

 

编辑:

凭直觉我知道数学答案将他们都是随机的,但我不禁认为如果你"运行随机数算法"两次当你把这两个放一起,你将创造出比只做一次更随机。

时间:

我对所有随机数问题的回答是 alt text

所以我想这两种方法是随机虽然我gutfeel会说 rand() * rand() 不是随机的,因为它将种子更多的0. 当一个 rand()0 时,总数将变为 0

'更多随机'都不是。

rand() 基于psuedo-random种子( 通常基于当前时间,它总是在改变) 生成一组可以预测的数字。 在序列中相乘两个连续数字会产生一个不同但同样可以预测的数字序列。

解决这里问题是否会减少冲突,答案是。 它实际上会增加碰撞,因为相乘的两个数字 0 <n <1 结果将是一个较小的分数,导致在光谱的下端产生偏差。

一些进一步的解释。在下面的例子中,'不可预测的'和'随意'引用了某人猜测下一个数字将基于以前的数字,IE 。 一个 oracle 。

生成以下值列表的种子 x:


0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3,.. .

rand() 将生成上面的列表,rand() * rand() 将生成:


0.18, 0.08, 0.08, 0.21,.. .

这两个方法将总是为相同的种子生成相同的数字列表,因此由oracle同样可以预测。 但是如果你看看两个调用相乘的结果,你会看到它们都在 0.3 下,尽管在原始序列中有一个不错的分布。 由于两个分数的影响,数字有偏差。 结果数字总是较小,因此更可能是碰撞,尽管仍然是不可预测的。

Oversimplification说明一点。

假定你的随机函数只输出 0 或者 1

random()(0,1) 之一,但 random()*random()(0,0,0,1) 之一

你可以清楚地看到,在第二个案例中获得 0的几率与获得 1的几率不一样。


当我第一次发布这个答案时,我希望尽可能简短,使一个阅读它的人能够理解 random()random()*random() 之间的差异,但我不能回答原始的广告litteram问题:

random

如果是 random()random()*random()random()+random()(random()+1)/2 或者任何其他不导致固定结果的组合都有相同的熵( 或者是伪随机数生成器的相同初始状态),答案就是它们是相同的随机( 不同之处在于它们的分布) 。 我们可以看的一个完美的例子是骰子游戏。 你得到的数字将是 random(1,6)+random(1,6),我们都知道获得 7的几率最高,但这并不意味着掷两个骰子的结果比滚动一个骰子的结果多。

强制 xkcd 。。
return 4 ;//chosen by fair dice roll, guaranteed to be random.

以更离散的数字来思考它可能会有帮助。 考虑在 1和 36之间生成随机数,所以你决定最简单的方式是掷两个公平的6 -sided骰子。 你可以看到:


 1 2 3 4 5 6
 -----------------------------
1| 1 2 3 4 5 6
2| 2 4 6 8 10 12
3| 3 6 9 12 15 18
4| 4 8 12 16 20 24 
5| 5 10 15 20 25 30
6| 6 12 18 24 30 36

所以我们有 36个数字,但不是所有的都是相当的代表,有些根本没有出现。 中心对角线( bottom-left角点到top-right拐角) 附近的数字将以最高频率出现。

描述骰子之间不公平分布的原理同样适用于 0.0和 1.0之间的浮点数。

关于"随机性"的一些事情是 counter-intuitive 。

假设 rand()的平面分布,下面将得到non-flat发行版:

  • 高偏差:sqrt(rand(range^2))
  • 中间偏置峰值: (rand(range) + rand(range))/2
  • low:bias: range - sqrt(rand(range^2))

创建特定的偏置曲线还有很多其他方法。 我快速测试了 rand() * rand(),它给你一个非常非线性的分布。

"随机"vs"更随机"有点像问哪个零更零'y 。

在这种情况下,rand 是一个 PRNG,所以不是完全随机的。 ( 实际上,如果种子已知,则相当可以预测) 。 乘以另一个值使它不再是随机的。

真正的crypto-type RNG实际上是随机的。 通过任何类型的函数运行值都不能给它增加更多的熵,而且很可能会移除熵,使得它不再是随机的。

...