提问人:lillq 提问时间:9/5/2008 最后编辑:MrValdezlillq 更新时间:10/5/2008 访问量:42098
如何在 C# 中生成随机数?
How do you generate a random number in C#?
答:
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);
对于双打,您可以将 Next 替换为 NextDouble
评论
System.Random r = new System.Random();
double rnd( double a, double b )
{
return a + r.NextDouble()*(b-a);
}
随机性如何?如果你能处理伪随机,那么只需:
Random randNum = new Random();
randNum. NextDouble(Min, Max);
如果你想要一个“更好”的随机数,那么你可能应该看看 Mersenne Twister 算法。不过,很多人已经为您实施了它
我唯一要对埃里克的回应补充的是解释;我觉得了解代码为什么起作用比知道什么代码起作用要好。
解释是这样的:假设你想要一个介于 2.5 和 4.5 之间的数字。范围为 2.0 (4.5 - 2.5)。 只返回一个介于 0 和 1.0 之间的数字,但如果将其乘以范围,您将得到一个介于 0 和范围之间的数字。NextDouble
因此,这将给我们 0.0 和 2.0 之间的随机双精度:
rng.NextDouble() * 2.0
但是,我们希望它们在 2.5 到 4.5 之间!我们是怎么做到的?添加最小的数字 2.5:
2.5 + rng.NextDouble() * 2.0
现在,我们得到一个介于 0.0 和 2.0 之间的数字;如果将 2.5 添加到每个值中,我们会看到范围现在介于 2.5 和 4.5 之间。
起初我认为 b > a 还是 a > b 很重要,但如果你以两种方式计算它,你会发现只要你不弄乱所用变量的顺序,它的工作方式是一样的。我喜欢用更长的变量名称来表达它,这样我就不会混淆:
double NextDouble(Random rng, double min, double max) { return min + (rng.NextDouble() * (max - min)); }
以下是如何获取冷冻安全随机数的片段: 这将用一个具有统计学意义的随机值序列填充 8 个字节。
byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);
有关更多详细信息,请参阅您的随机性有多随机??(灵感来自一篇关于甲板洗牌的 CodingHorror 文章)
为了解释为什么 Longhorn 被缩减了这么多:http://msdn.microsoft.com/en-us/magazine/cc163367.aspx 寻找 NextDouble 的实现以及什么是随机双精度的解释。
该链接也是一个示例,说明如何仅将加密随机数(如Sameer提到的)与实际有用的输出而不是比特流一起使用。
评论