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