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

时间:2008-09-04 18:30:58

标签: c# floating-point random

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

6 个答案:

答案 0 :(得分:60)

我唯一要补充的是Eric的回应是一个解释;我觉得有关代码工作原理的知识比知道代码的工作原理要好。

解释如下:假设你想要一个2.5到4.5之间的数字。范围是2.0(4.5 - 2.5)。 NextDouble仅返回介于0和1.0之间的数字,但如果将其乘以范围,则会得到介于0和范围之间的数字。

所以,这会给我们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 :(得分:20)

System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}

答案 2 :(得分:2)

// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

对于双打,您可以使用NextDouble

替换Next

答案 3 :(得分:1)

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

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

如果你想要一个“更好”的随机数,那么你可能应该看看Mersenne Twister算法。尽管

有很多人为你already implemented it

答案 4 :(得分:1)

以下是如何获取加密安全随机数的摘录: 这将使用密码学上强大的随机值序列填充8个字节。

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

有关详细信息,请参阅How Random is your Random??"(受CodingHorror甲板改组文章的启发)

答案 5 :(得分:1)

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

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