C# RNGCryptoServiceProvider的利弊

C# RNGCryptoServiceProvider的利弊,c#,.net,random,C#,.net,Random,使用System.Security.Cryptography.RNGCryptoServiceProvidervsSystem.Random的优缺点是什么。我知道,RNGCryptoServiceProvider是“更随机的”,也就是说,对于黑客来说,不太可预测。还有其他的优点或缺点吗 更新: 根据回复,以下是迄今为止使用RNGCryptoServiceProvider的利弊: 赞成的意见 RNGCryptoServiceProvider是一个更强的加密随机数,这意味着它更适合确定加密密钥等

使用
System.Security.Cryptography.RNGCryptoServiceProvider
vs
System.Random
的优缺点是什么。我知道,
RNGCryptoServiceProvider
是“更随机的”,也就是说,对于黑客来说,不太可预测。还有其他的优点或缺点吗


更新:

根据回复,以下是迄今为止使用
RNGCryptoServiceProvider
的利弊:

赞成的意见
  • RNGCryptoServiceProvider
    是一个更强的加密随机数,这意味着它更适合确定加密密钥等
欺骗
  • Random
    更快,因为它的计算更简单;当用于模拟或长时间计算时,如果加密随机性不重要,则应使用此选项。注意:有关模拟的详细信息,请参阅-
    随机
    不一定是随机的,您可能需要使用不同的非加密PRNG

一个加密性强的RNG会更慢——它需要更多的计算——并且会是光谱白色的,但不太适合于模拟或蒙特卡罗方法,因为它们确实需要更多的时间,而且可能不可重复,这对于测试来说很好


一般来说,当您想要一个唯一的数字(如UUID)或作为加密的密钥时,您需要使用加密PRNG,而在模拟中需要一个确定性PRNG来提高速度

是的,只剩一个了。正如查理·马丁(Charlie Martin)所写的“系统.随机”更快

我想添加以下信息:

RNGCryptoServiceProvider
是符合安全标准的随机数生成器的默认实现。如果出于安全目的需要随机变量,则必须使用此类或等效类,但不要使用System.random,因为它是高度可预测的


对于所有其他用途,欢迎使用性能更高的
系统。Random
和等效类。

系统。Random
不是线程安全的。

除了前面的答案之外:


System.Random
不应用于科学和工程的模拟或数值解算器中,因为模拟结果不准确或收敛失败会产生重大负面后果。 这是因为Microsoft的实现在几个方面存在严重缺陷,并且由于兼容性问题,他们无法(或不会)轻松修复它。 看

因此:

  • 如果有对手不应该知道生成的序列,则使用
    RNGCryptoServiceProvider
    或另一个精心设计、实施和验证的加密强RNG,并尽可能使用硬件随机性。 否则

  • 如果是需要良好统计特性的应用程序(如模拟),则使用精心设计和实施的非加密PRNG,如。 (在这些情况下,加密RNG也是正确的,但通常过于缓慢和笨拙。) 否则

  • 只有在数字的使用非常简单的情况下,例如决定在随机幻灯片中显示下一张图片时,才使用
    System.Random


我最近在进行蒙特卡罗模拟(Monte Carlo simulation)时非常明显地遇到了这个问题,该模拟旨在测试医疗设备不同使用模式的影响。 模拟产生的结果与合理预期的结果略有相反

有时,当你无法解释某件事时,背后有一个原因,而这个原因可能非常繁重

以下是在越来越多的模拟批次中获得的p值图:

红色和品红图显示了两种使用模型在研究中的两个输出指标中的差异的统计显著性

青色图是一个特别令人震惊的结果,因为它代表了模拟随机输入特征的p值。 (绘制此图只是为了确认输入没有故障。) 当然,通过设计,研究中的两个使用模型之间的输入是相同的,因此两个模型之间的输入不应该有任何统计上的显著差异。 然而,在这里,我看到了比99.97%的信心更好的东西,那就是有这样的差异

起初我认为我的代码有问题,但一切都被证实了。 (我特别确认线程没有共享
System.Random
实例。) 当重复测试发现这个意外结果高度一致时,我开始怀疑
System.Random

我用Mersenne Twister实现替换了
System.Random
 — 没有其他变化, — 输出立即变得截然不同,如下所示:

该图表反映了在该特定测试集中使用的参数的两种使用模型之间没有统计上的显著差异。 这是一个预期的结果

请注意,在第一张图表中,垂直对数标度(在p值上)涵盖了七十年,而在第二张图表中只有一个十年 — 证明了虚假差异的统计显著性是多么显著! (垂直刻度表示差异可能是偶然产生的概率。)

我怀疑发生的事情是,
System.Random
在相当短的生成器周期内具有一定的相关性,并且两个测试模型之间的内部随机性采样模式不同(这两个模型对
Random.Next
的调用数相差很大)