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

时间:2020-03-05 18:47:49  来源:igfitidea点击:

我想在2个值之间生成一个随机浮点数。用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算法。很多人已经为我们实施了它

回答

我要在Eric的回应中添加的唯一内容是解释。我认为,了解为什么代码有效比知道什么代码有效更好。

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

因此,这将使我们在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);

有关更多详细信息,请参见随机数是多少?

回答

有关为何Longhorn为何如此低调的解释:http://msdn.microsoft.com/zh-cn/magazine/cc163367.aspx寻找NextDouble的实现以及什么是随机double的解释。

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