如何在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提到的)与实际有用的输出一起使用,而不使用比特流。