【发布时间】:2021-03-17 19:51:59
【问题描述】:
以下代码在 [0,1) 范围内生成一个双精度数,这意味着 1 是互斥的。
var random = new Random();
random.NextDouble();
我正在寻找一些智能方法来生成 [0,1] 范围内的随机双精度数。这意味着 1 包含在内。我知道生成 0 或 1 的概率非常低,但想象一下我想实现一个正确的数学函数,该函数需要我的包容性限制。我该怎么做?
问题是:在 [0,1] 范围内生成随机数的正确方法是什么。如果没有这样的方法,我也很想学。
【问题讨论】:
-
拥有
1(连续段[0..1]上的点)的概率为0,即为什么你可以保留random.NextDouble(); -
@Dimitry 那不是也意味着在 [0..1] 中生成 0 的概率也是 .. 0 吗?然而,0 在 [0, 1) 中,如果有足够的样本,将返回。 Double(和随机源)具有一组有限的值。
-
双精度值没有精确值。如果你想要精确的值,你应该改用小数。查看这篇文章以了解随机十进制实现:stackoverflow.com/questions/609501/…
-
一个双精度可以准确地表示值 1.0。由于小数仍然不能代表 [0,1] 中的所有数字,因此建议在问题的上下文中使用小数似乎有点愚蠢,尤其是因为它不会改变 NextDouble(或假设的 NextDecimal)的范围。
-
如果我们假设
r.NextDouble()可以产生 any 双精度值,那么就没有正确的方法来产生你想要的东西。您可以制定几种方案来获得值 1 作为可能的输出,但是获得该数字的结果机会将是倾斜的。如果我们假设r.NextDouble()不能产生从 0 到 1 的每一个可能的双精度值,则可以使用r.Next(int.MaxInt) / (double)(int.MaxInt - 1)。