我想在2个值之间生成一个随机浮点数。在C#中执行此操作的最佳方法是什么?
答案 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示例。