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;