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

问题描述:

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

我唯一加入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)); 
}

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

双打您可以NextDouble

+1

这实际上并不准确。 NextDouble只在0.0和1.0之间生成。 – Bloodyaugust 2011-12-16 09:09:11

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); 

如果你想要一个“更好”的随机数,那么你可能应该看看梅森倍捻机算法。很多人对你而言有already implemented it虽然

下面是如何获得Cryographically安全随机数的片段: 这将在8个字节填充一个crytographically强随机值序列。

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

欲了解更多详情,请参阅How Random is your Random??"

(上甲板洗牌一CodingHorror文章的启发)有关为何Longhorn中已经downmodded这么多的交代:http://msdn.microsoft.com/en-us/magazine/cc163367.aspx查找NextDouble的实施和解释什么是一个随机双。

该链接也是如何使用密码随机数(如Sameer提到的)的实例,只有实际有用的输出而不是比特流。