在寻找生成真正随机数的最佳try 时,我偶然发现了这个代码示例.

寻找对这个片段的意见.

using System;
using System.Security.Cryptography;

private static int NextInt(int min, int max)
{
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buffer = new byte[4];
    
    rng.GetBytes(buffer);
    int result = BitConverter.ToInt32(buffer, 0);

    return new Random(result).Next(min, max);
}

来源:http://www.vcskicks.com/code-snippet/rng-int.php

这是否比使用滴答计数种子更可取,例如:

Random rand = new Random(Environment.TickCount); 
rand.Next(min, max);

Note:

我不是在寻找第三方随机数据提供者,比如Random.org,因为这样的依赖关系对应用程序来说是不现实的.

推荐答案

好吧,使用RNGCryptoServiceProvider会给你一个不可用的加密强度种子,而理论上,Environment.TickCount是可预测的.

当快速连续地多次调用您的NextInt方法时,另一个重要的区别将是显而易见的.使用RNGCryptoServiceProvider将使Random对象每次都具有不同的加密强度数字,这意味着它将继续为每次调用返回不同的随机数字.使用TickCount可能会使Random对象每次都使用相同的数字(如果该方法在相同的"Tick"期间被多次调用),这意味着它将继续为每次调用返回相同的(假定是随机的)数字.

如果你真的需要truly个随机数,那么你根本不应该使用计算机来产生它们:你应该测量放射性衰变或其他类似的,真正不可预测的东西.

Asp.net相关问答推荐

ASP.NET多行查询文本框中的多个名称并将结果添加到单个网格视图

Reaction-Native SignalR连接在调试模式下工作,在释放模式下失败

RNGCryptoServiceProvider - 随机数审核

web.config 部分的单独配置文件

如何获取已构建、编码的 ViewState 的值?

OnCheckedChanged 事件未触发

异步编程与线程有什么不同?

Twitter bootstrap glyphicons 不会出现在发布模式 404 中

System.Linq.Dynamic 不支持 OrderByDescending("someColumn")?

如何通过后面的代码不显示

Devexpress 或 Telerik Controls 比较

为什么 Asp.Net Identity IdentityDbContext 是一个黑盒?

如何判断用户代理是 ipad 还是 iphone?

如何在 ASP.NET MVC 中启用跨源请求

如何在实体框架中添加表?

如何从 ASP.NET 中的数据表/数据视图中 Select 前 n 行

ASP.NET:在 Response.Redirect(...) 之后代码会发生什么?

如何将 DataTable 转换为类 Object?

如何创建代表 colored颜色 的随机十六进制字符串?

新的 csproj 文件 struct 可以与 ASP.NET Framework 项目一起使用吗?