Math “理解”;“随机性”;
我无法理解这一点,哪一个更随机Math “理解”;“随机性”;,math,language-agnostic,random,Math,Language Agnostic,Random,我无法理解这一点,哪一个更随机 rand() 或: rand() * rand() 我发现这真是个脑筋急转弯,你能帮我一下吗 编辑: 直观地说,我知道数学上的答案是它们同样随机,但我忍不住想,如果你在将两者相乘时“运行随机数算法”两次,你会创造出比只做一次更随机的东西。随机”与“更随机”这有点像问哪个零更像零 在这种情况下,rand是一个PRNG,所以不是完全随机的。(事实上,如果种子是已知的,这是可以预测的)。将其与另一个值相乘,使其不再具有随机性 真正的加密类型RNG实际上是随机的。通
rand()
或:
rand() * rand()
我发现这真是个脑筋急转弯,你能帮我一下吗
编辑: 直观地说,我知道数学上的答案是它们同样随机,但我忍不住想,如果你在将两者相乘时“运行随机数算法”两次,你会创造出比只做一次更随机的东西。随机”与“更随机”这有点像问哪个零更像零 在这种情况下,
rand
是一个PRNG,所以不是完全随机的。(事实上,如果种子是已知的,这是可以预测的)。将其与另一个值相乘,使其不再具有随机性
真正的加密类型RNG实际上是随机的。通过任何类型的函数运行值都不能增加更多的熵,很可能会删除熵,使其不再随机。也不是“更随机”
rand()
基于psuedo随机种子(通常基于当前时间,该时间总是在变化)生成一组可预测的数字。将序列中的两个连续数字相乘可生成不同但同样可预测的数字序列
至于这是否会减少冲突,答案是否定的。它实际上会增加冲突,因为在0
中,两个数字相乘会产生影响。结果将是较小的分数,导致结果偏向光谱的低端
一些进一步的解释。在下文中,“不可预测”和“随机”指的是某人根据之前的数字猜测下一个数字的能力,即甲骨文
给定种子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
下,尽管在原始序列中有一个不错的分布。由于两个分数相乘的影响,这些数字是有偏差的。结果的数字总是较小,因此更可能发生碰撞,尽管仍然无法预测。只是澄清一下
尽管当您试图发现伪随机变量或其乘法的随机性时,前面的答案是正确的,但您应该注意,虽然random()通常是均匀分布的,但random()*random()不是
例子
这是一个通过伪随机变量模拟的过程:
这是两个随机变量相乘后得到的分布:
因此,两者都是“随机”的,但它们的分布非常不同
另一个例子
2*Random()是均匀分布的:
BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]
Random()+Random()不是强>
BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] +
RandomReal[{0, 1}, 50000], {50000}], 0.01]]
中心极限定理
表示随着项的增加,Random()的和趋于a。
您只需使用四个术语即可获得:
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个均匀分布的随机变量,看到从均匀分布到正态分布的道路:
编辑
几个学分
感谢您在评论中指出,最后两张图片中显示的概率分布称为
感谢她的精彩关于“随机性”的一些事情是违反直觉的
假设rand()
为平面分布,则以下内容将为您提供非平面分布:
- 高偏差:
sqrt(兰特(范围^2))
- 中间的偏差峰值:
(兰特(范围)+兰特(范围))/2
- 低:偏差:
range-sqrt(rand(range^2))
rand()*rand()
,它得到了一个非常非线性的分布。大多数rand()实现都有一定的周期。也就是说,在大量调用之后,序列会重复。rand()*rand()
的输出序列在一半的时间内重复,因此从这个意义上讲,它“不那么随机”
此外,如果不仔细构造,对随机值执行算术往往会导致较少的随机性。上面的一张海报引用了“rand()
+rand()
+rand()
..”(比如说,k倍),这实际上是rand()
返回值范围平均值的k倍。(这是一个随机行走,其步数与平均值对称。)
为具体起见,假设您的rand()函数返回范围为[0,1]的均匀分布随机实数。(是的,本例允许无限精度。这不会改变结果。)您没有选择特定的语言,不同的语言可能会做不同的事情,但以下分析适用于rand()的任何非反常实现。产品rand()*rand()
也在范围内[0,1),但不再是均匀分布的。事实上,乘积在区间[0,1/4]中的可能性与在区间[1/4,1]中的可能性一样。乘法越多,结果越倾向于零。这使得结果更可预测。在宽笔划中,更可预测==更少随机
几乎所有对均匀随机输入的操作序列都将是非均匀随机的,从而提高了可预测性。只要小心,就可以克服这一特性,但这样就更容易在实际需要的范围内生成均匀分布的随机数,而不是在算术上浪费时间。Float随机分组是以g为基础的
BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] +
RandomReal[{0, 1}, 50000], {50000}], 0.01]]
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 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
rand() mod 2
rand() * rand() mod 2
010110101110010
double a = rand();
double b = rand();
double c = a * b;