如何在 C# 中生成随机数?

How do you generate a random number in C#?

提问人:lillq 提问时间:9/5/2008 最后编辑:MrValdezlillq 更新时间:10/5/2008 访问量:42098

问:

我想在 2 个值之间生成一个随机浮点数。在 C# 中执行此操作的最佳方法是什么?

C# 浮点 随机数

评论


答:

2赞 Ryan Farley 9/5/2008 #1
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

对于双打,您可以将 Next 替换为 NextDouble

评论

1赞 Bloodyaugust 12/16/2011
这实际上并不准确。NextDouble 仅生成介于 0.0 和 1.0 之间的数据。
3赞 Chris Klepeis 12/23/2011
NextDouble() 从我所看到的内容中不带任何参数。
20赞 Eric 9/5/2008 #2
System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
1赞 enigmatic 9/5/2008 #3

随机性如何?如果你能处理伪随机,那么只需:

Random randNum = new Random();
randNum. NextDouble(Min, Max);

如果你想要一个“更好”的随机数,那么你可能应该看看 Mersenne Twister 算法。不过,很多人已经为您实施了它

60赞 OwenP 9/5/2008 #4

我唯一要对埃里克的回应补充的是解释;我觉得了解代码为什么起作用比知道什么代码起作用要好。

解释是这样的:假设你想要一个介于 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));
}
1赞 Sameer Alibhai 9/5/2008 #5

以下是如何获取冷冻安全随机数的片段: 这将用一个具有统计学意义的随机值序列填充 8 个字节。

byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);

有关更多详细信息,请参阅您的随机性有多随机??(灵感来自一篇关于甲板洗牌的 CodingHorror 文章)

1赞 Andrew Burns 9/5/2008 #6

为了解释为什么 Longhorn 被缩减了这么多:http://msdn.microsoft.com/en-us/magazine/cc163367.aspx 寻找 NextDouble 的实现以及什么是随机双精度的解释。

该链接也是一个示例,说明如何仅将加密随机数(如Sameer提到的)与实际有用的输出而不是比特流一起使用。