C++ 从一个更好的随机源中随机数播种伪随机发生器

C++ 从一个更好的随机源中随机数播种伪随机发生器,c++,c,security,random,entropy,C++,C,Security,Random,Entropy,假设我们有一个伪随机数生成器,它接受一个32位整数作为种子,例如C标准库中的rand函数,它从原始种子中导出随机数。如果那颗种子来自,比方说,放射性衰变,那么假设我们通过调用rand得到的随机数与通过放射性衰变生成的随机数一样好是正确的吗?随机数的质量来自随机数生成器的质量。生成伪随机数的方法有很多种,您选择的方法应该适合您的应用,但老实说,如果您可以访问放射性衰变监测设备,那么您可能可以访问其他完全随机的真实世界事件中的真实随机数,而不是播种一个伪种子。不,绝对不是。C/C++标准库的内置ra

假设我们有一个伪随机数生成器,它接受一个32位整数作为种子,例如C标准库中的rand函数,它从原始种子中导出随机数。如果那颗种子来自,比方说,放射性衰变,那么假设我们通过调用rand得到的随机数与通过放射性衰变生成的随机数一样好是正确的吗?

随机数的质量来自随机数生成器的质量。生成伪随机数的方法有很多种,您选择的方法应该适合您的应用,但老实说,如果您可以访问放射性衰变监测设备,那么您可能可以访问其他完全随机的真实世界事件中的真实随机数,而不是播种一个伪种子。

不,绝对不是。C/C++标准库的内置rand函数通常作为LCG实现。它是已知最早的伪随机数发生器PRNG家族之一,它们通常具有众所周知的糟糕的统计特性。此外,由于PRNG实际上产生由初始种子预先确定的数学序列,因此它们是可预测的。即使是加密安全的伪随机数生成器(如)也是可预测的,即使预测序列在计算上很困难且非常耗时

相反,基于放射性衰变的随机数发生器是真正的随机数发生器。生成的数字序列完全均匀分布且不可预测,样本之间没有任何可测量的相关性

回到伪随机数,初始种子源的统计质量不会改善生成的伪随机序列的统计质量-它只取决于生成器本身。如果使用真正的随机数为PRNG设定种子,则序列的第一个数字将不可预测,但序列的质量将与没有真正的随机种子时相同

如果你想要高质量的随机性,你必须使用高质量的随机数生成器。有一些伪随机数生成器具有优异的统计特性,但绝对不是著名的,通过了所有当前的随机性统计测试-虽然生成的伪随机序列仍然是可预测的,但从统计上很难与真正的随机序列区分开来

现代随机数生成器的一个很好的可靠资源是。

否。随机数序列的属性完全取决于随机数生成器RNG。因此,后续随机数之间的任何相关性都取决于RNG,而不是种子


然而,尽管如此,种子对于避免在不同代码运行时生成的序列之间的相似性非常重要。因此,您应该始终尝试使用真正的随机种子为RNG播种。

伪随机数PRN可能是一个近似随机数的序列。然而,真正的随机数TRN是通过从熵源获取输入来生成随机数的数,熵源可以是从振动到硬盘活动的任何物理环境。C库的rand属于PRN的范畴。对于高随机性,最好使用使用/dev/random或/dev/urandom的库

请参阅urandom的手册页,以了解有关随机、urandom-内核随机数源设备的更多详细信息。
随机数生成器将来自设备驱动程序和其他源的环境噪声收集到熵池中。生成器还保留熵池中噪声位数的估计值。从这个熵池中创建随机数

您是否在问,自程序启动以来,从衰变中播种是否比从滴答声中播种好?当随机数生成器未移除熵时,例如,当种子为32位时,查看第一个数字是否好,生成器应能够输出所有可能的2^32值,而不是仅输出2^16值,方法是将其丢弃到高位16位。但是,除非用熵重新填充种子,否则后续生成的数字的质量将越来越低。@取消标记新数字将不会包含超过32位的熵。@OliverCharlesworth您可以轻松地将一个非常糟糕的随机数生成器定义为x=x+1。然后尝试用一个真正的随机数来播种。根据你的说法,整个序列现在是随机的。事实上,由于初始种子是真正随机的,因此无法预测哪一个是伪随机序列的第一个数字,但结果会很糟糕:序列根本不是随机的。但是,无论算法正确与否,随机种子肯定会影响结果?假设伪算法是s+n+1,其中s是种子,n是要生成的数字的索引
1是一个常数。用监测放射性衰变生成的数字896为该算法设定种子,然后该算法输出的第一个数字是897,这与种子数一样难猜/不可能猜到。使用此算法生成的后续数字不需要重新播种,这将很容易预测,但第一个数字不是?只要你总是使用不同的随机数进行播种,那么源是无关的。只要有人机交互,就会有变化,因此我怀疑使用衰减方法生成种子是否比某人点击UI启动程序所需的时间要好。当然,这是一个总是在午夜重新启动的服务器,而您从一天开始就把滴答声作为种子,这不是一个好方法。@取消trade您的假设在您的评论中是正确的。如果您的初始种子是真正随机的,则无法预测序列的第一个数字,因为第一个数字仅取决于该真正随机的数字,而没有任何先前的状态。然而,后续数字的质量由伪随机数生成器决定。