我想在 2 个值之间生成一个随机浮点数。在 C# 中执行此操作的最佳方法是什么?
6 回答
我要添加到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 很重要,但如果你用两种方法来计算,你会发现只要你不弄乱使用的变量的顺序,它的工作原理是一样的。我喜欢用更长的变量名来表达它,所以我不会混淆:
双 NextDouble(随机 rng,双最小值,双最大值) { 返回最小值 + (rng.NextDouble() * (max - min)); }
System.Random r = new System.Random();
double rnd( double a, double b )
{
return a + r.NextDouble()*(b-a);
}
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);
对于双打,您可以将 Next 替换为 NextDouble
随机性如何?如果您可以处理伪随机,那么只需:
Random randNum = new Random();
randNum. NextDouble(Min, Max);
如果您想要一个“更好”的随机数,那么您可能应该查看 Mersenne Twister 算法。很多人已经为你实现了它
以下是如何获取加密安全随机数的片段:这将使用加密强的随机值序列填充 8 个字节。
byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);
有关更多详细信息,请参阅您的 Random 有多随机??”(灵感来自 CodingHorror 上关于牌组洗牌的文章)
有关 Longhorn 为何如此被降级的解释:http: //msdn.microsoft.com/en-us/magazine/cc163367.aspx查找 NextDouble 的实现以及什么是随机双精度的解释。
该链接也是一个很好的例子,说明如何仅使用实际有用的输出而不是比特流来使用加密随机数(如 Sameer 提到的)。