理解“随机性”

我没法理解这一点,这更随机? 算法

rand()

要么 数组

rand() * rand()

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

编辑: dom

直观地,我知道数学答案将是它们一样随机,但我不由想到,若是你将二者相乘的话“运行随机数算法”两次,你会创造一些比随机更随机的东西它一次。 函数


#1楼

咱们能够经过使用Kolmogorov复杂度来比较关于随机性的两个数组。若是数字序列不能被压缩,那么它是咱们在这个长度上能够达到的最随机...我知道这种类型的测量更像是理论选项... 网站


#2楼

正如其余人已经指出的那样,这个问题很难回答,由于咱们每一个人都有本身的随机性加密

这就是为何,我强烈建议您花一些时间阅读本网站以更好地了解随机性: spa

回到真正的问题。 这个术语中没有或多或少的随机: code

二者都只是随机出现get

在这两种状况下 - 只是rand()或rand()* rand() - 状况是相同的:在几十亿个数字以后,序列将重复(!) 。 它对于观察者来讲彷佛是随机的,由于他不知道整个序列,但计算机没有真正的随机源 - 因此他也不能产生随机性。

例如:天气是随机的吗? 咱们没有足够的传感器或知识来肯定天气是否随机。


#3楼

实际上,当你想到它时rand() * rand()rand() 更不随机。 这就是缘由。

基本上,奇数与偶数相同。 而且说0.04325是奇数,而且像0.388是偶数,0.4是偶数,0.15是奇数,

这意味着rand()具备偶数或奇数十进制平等机会

另外一方面, rand() * rand()的赔率有点不一样。 让咱们说:

double a = rand();
double b = rand();
double c = a * b;

ab都有50%的偶数或奇数的几率。 知道

  • 甚至*偶数=偶数
  • 偶数*奇数=偶数
  • 奇数*奇数=奇数
  • 奇数*偶数=偶数

意味着有75%的可能性c是偶数,而只有25%的可能性是奇数,使得rand() * rand()的值比rand()更可预测,所以随机性更小。


#4楼

“随机”与“更随机”有点像询问哪一个零更零。

在这种状况下, rand是一个PRNG,因此不是彻底随机的。 (事实上​​,若是已知种子,则能够预测)。 将它乘以另外一个值使其再也不或多或少随机。

真正的加密型RNG其实是随机的。 经过任何类型的函数运行值都不能为它添加更多的熵,而且可能极可能删除熵,使其再也不随机。


#5楼

二者都不是“更随机”。

rand()根据伪随机种子(一般基于当前时间,老是在变化)生成一组可预测的数字。 将序列中的两个连续数字相乘可生成不一样但一样可预测的数字序列。

解决这是否会减小碰撞,答案是否认的。 它实际上会增长碰撞,由于在0 < n < 1下将两个数相乘。 结果将是较小的分数,致使结果偏向光谱的下端。

一些进一步的解释。 在下文中,“不可预测的”和“随机的”是指某人根据先前的数字猜想下一个数字的能力,即。 一个神谕。

给定种子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之下,尽管在原始序列中分布不错。 因为两个分数相乘的影响,数字有误差。 由此产生的数字老是较小,所以尽管仍然是不可预测的,但更多是碰撞。

相关文章
相关标签/搜索