使用qazxsw poi和qazxsw poi有什么利弊。我知道qazxsw poi“更随机”,即对黑客的可预测性更低。任何其他利弊?
更新:
根据回复,以下是到目前为止使用System.Security.Cryptography.RNGCryptoServiceProvider
的利弊:
System.Random
是一个更强大的加密随机数,这意味着它更适合确定加密密钥等。RNGCryptoServiceProvider
更快,因为它是一个更简单的计算;当在模拟或长时间计算中使用加密随机性不重要时,应该使用它。注意:有关模拟的详细信息,请参阅RNGCryptoServiceProvider
- RNGCryptoServiceProvider
不一定是随机的,您可能希望使用不同的非加密PRNG。密码学上强大的RNG将会更慢 - 它需要更多的计算 - 并且将是光谱白色,但不太适合模拟或蒙特卡罗方法,因为它们确实需要更多时间,并且因为它们可能不可重复,这对测试很好。
通常,当您需要唯一的数字(如UUID)或加密密钥以及速度和模拟的确定性PRNG时,您希望使用加密PRNG。
Random
不是线程安全的。
是的,只有一个。正如查理·马丁写的那样Kevin's answer更快。
我想添加以下信息:
Random
是符合安全标准的随机数生成器的默认实现。如果出于安全目的需要随机变量,则必须使用此类或等效项,但不要使用System.Random,因为它具有高度可预测性。
对于所有其他用途,欢迎System.Random
和同等级别的更高性能。
除了先前的答案:
System.Random
绝不能用于科学和工程的模拟或数值求解,其中存在不准确的模拟结果或收敛失败的重大负面后果。这是因为Microsoft的实现在几个方面存在严重缺陷,并且由于兼容性问题,他们不能(或不会)轻松修复它。见RNGCryptoServiceProvider
。
所以:
System.Random
或其他精心设计,实现和验证的加密强RNG,理想情况下尽可能使用硬件随机性。除此以外;System.Random
。 (在这些情况下,加密RNG也是正确的,但通常太慢而且不实用。)否则;我最近在进行蒙特卡罗模拟时非常明显地遇到了这个问题,该模拟旨在测试不同使用模式对医疗设备的影响。模拟产生的结果与合理预期的方向相反。
有时当你无法解释某些事情时,背后有一个原因,这个理由可能非常繁重!
这是通过越来越多的模拟批次获得的p值图:
RNGCryptoServiceProvider
红色和品红色图显示了研究中两个输出指标中两种使用模型之间差异的统计显着性。
青色图是一个特别令人震惊的结果,因为它代表了模拟随机输入特征的p值。 (这是为了确认输入没有错误而绘制的。)当然,输入是在研究中的两个使用模型之间的设计相同,因此两个模型的输入之间不应存在任何统计上显着的差异。 。然而在这里,我看到有超过99.97%的信心,有这样的差异!
最初我认为我的代码有问题,但一切都检查出来了。 (特别是我确认线程没有共享Mersenne Twister实例。)当重复测试发现这个意外结果高度一致时,我开始怀疑System.Random
。
我用Mersenne Twister实现替换了 - 没有其他变化, - 立即输出变得截然不同,如下所示:
System.Random
该图表反映了在该特定测试集中使用的参数的两种使用模型之间没有统计学上的显着差异。这是预期的结果。
请注意,在第一个图表中,垂直对数标度(在p值上)涵盖七十年,而在第二个图表中只有一个十年 - 证明了虚假差异的统计显着性有多明显! (垂直刻度表示偶然出现差异的概率。)
我怀疑发生了什么是System.Random
在一些相当短的发电机周期上有一些相关性,并且两个被测模型之间的内部随机抽样的不同模式(它们对System.Random
的调用次数差异很大)导致这些影响了两个模型。不同的方法。
碰巧的是,模拟输入来自与模型用于内部决策的相同RNG流,这显然导致这些采样差异影响输入。 (这实际上是一件幸运的事情,因为否则我可能没有意识到意外结果是软件故障,而不是模拟设备的某些不动产!)