如何在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
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提到的)的实例,只有实际有用的输出而不是比特流。
这实际上并不准确。 NextDouble只在0.0和1.0之间生成。 – Bloodyaugust 2011-12-16 09:09:11