【问题标题】:How can I get a uniformly distributed random number from the interval [0, 1] in C++? [duplicate]如何从 C++ 中的区间 [0, 1] 中获得均匀分布的随机数? [复制]
【发布时间】:2015-06-05 18:02:42
【问题描述】:

如何从区间 [0, 1] 中得到一个均匀分布的随机数?

我目前正在使用以下代码,但它是用 C 语言编写的,我想知道如何用 C++ 代替。

double RND()
{
    return ((double)rand()/RAND_MAX);
}

【问题讨论】:

  • 虽然rand()/RAND_MAX读了很多,但还是不统一。
  • 1.是什么让您认为这不适用于 C++?
  • 我想找一个统一的随机数。我使用上面的代码来生成那个数字。但是,如果我创建一个 C++ 函数会更好
  • 在 C++11 中使用随机数库。 Mersenne twister 是一个很好的起点。
  • 这种类型的基线函数将在 C++ 中保持原样。如果要将其转换为方法,则需要定义一个类来保存该函数。如果您已经有一个需要此方法的类,只需更改函数语句行,使其成为现有类的成员函数。

标签: c++


【解决方案1】:

您可以使用 C++11 中添加的 <random> 库。有关分发和不同 RNG 的更多信息,请参阅cplusplus.com

std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0.0,1.0);
double number = distribution(generator);

编辑:正如长颈鹿船长所指出的,上面的代码将用于范围 [0,1) 而不是 [0,1]。使用 T.C. 建议的 std::uniform_real_distribution&lt;double&gt; distribution(0.0,std::nextafter(1.0, 2.0)); 来获得封闭的上限。

【讨论】:

  • 来自文档“均匀分布在区间[a, b)上”,。 IE。不包括 b。
  • 对于闭区间,使用std::nextafter(1.0, 2.0)作为上限。
  • 只有 [0 1)。但我需要范围 [0 1]
  • 是的,使用 T.C.回答。 std::uniform_real_distribution&lt;double&gt; distribution(0.0,std::nextafter(1.0, 2.0));
【解决方案2】:

要正确地做到这一点实际上有些棘手。对于整数,均匀分布类产生范围 [min...max] 内的数字,但对于实数,范围是 [min ... max)。为了得到 [0 .. 1.0],我们需要在范围的上端添加一个小数。碰巧的是,由于我们的数字是 1.0,标准库为我们提供了准确的数字,可以添加为目标类型的 epsilon()

std::mt19937_64 gen{ std::random_device()() };
std::uniform_real_distribution<double> dis{
    0.0,
    1.0 + std::numeric_limits<double>::epsilon()
};

epsilon 是可以添加到 1.0 并产生大于 1.0 的结果的最小数字,因此这允许最大(包括)1.0 的数字,但 no 更大--正是要求的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多