33

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

4

6 回答 6

60

我要添加到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));
}
于 2008-09-04T18:52:22.103 回答
20
System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
于 2008-09-04T18:35:15.577 回答
2
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

对于双打,您可以将 Next 替换为 NextDouble

于 2008-09-04T18:34:53.423 回答
1

随机性如何?如果您可以处理伪随机,那么只需:

Random randNum = new Random();
randNum. NextDouble(Min, Max);

如果您想要一个“更好”的随机数,那么您可能应该查看 Mersenne Twister 算法。很多人已经为你实现了它

于 2008-09-04T18:37:17.990 回答
1

以下是如何获取加密安全随机数的片段:这将使用加密强的随机值序列填充 8 个字节。

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

有关更多详细信息,请参阅您的 Random 有多随机??”(灵感来自 CodingHorror 上关于牌组洗牌的文章)

于 2008-09-04T18:54:17.387 回答
1

有关 Longhorn 为何如此被降级的解释:http: //msdn.microsoft.com/en-us/magazine/cc163367.aspx查找 NextDouble 的实现以及什么是随机双精度的解释。

该链接也是一个很好的例子,说明如何仅使用实际有用的输出而不是比特流来使用加密随机数(如 Sameer 提到的)。

于 2008-09-04T19:03:36.100 回答