在整个范围内均匀生成随机数

新手上路,请多包涵

我需要在指定的时间间隔内生成随机数,[max;min]。

此外,随机数应均匀分布在区间上,而不是位于特定点。

目前我正在生成:

 for(int i=0; i<6; i++)
{
    DWORD random = rand()%(max-min+1) + min;
}

根据我的测试,随机数仅在一点附近生成。

 Example
min = 3604607;
max = 7654607;

生成的随机数:

 3631594
3609293
3630000
3628441
3636376
3621404

从下面的答案:好的,RAND_MAX 是 32767。我在 C++ Windows 平台上。有没有其他方法可以生成均匀分布的随机数?

原文由 anand 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 577
2 个回答

为什么 rand 是个坏主意

您在这里得到的大多数答案都使用了 rand 函数和模运算符。该方法 可能不会统一生成数字(它取决于 RAND_MAX 的范围和值),因此不鼓励使用。

C++11 和生成范围内

在 C++11 中,出现了多种其他选择。其中一个符合您的要求,可以很好地生成一个范围内的随机数: std::uniform_int_distribution 。这是一个例子:

 #include <iostream>
#include <random>
int main()
{
    const int range_from  = 0;
    const int range_to    = 1000;
    std::random_device                  rand_dev;
    std::mt19937                        generator(rand_dev());
    std::uniform_int_distribution<int>  distr(range_from, range_to);

    std::cout << distr(generator) << '\n';
}

在 Godbolt 上在线尝试

是正在运行的示例。

模板功能可能会有所帮助:

 template<typename T>
T random(T range_from, T range_to) {
    std::random_device                  rand_dev;
    std::mt19937                        generator(rand_dev());
    std::uniform_int_distribution<T>    distr(range_from, range_to);
    return distr(generator);
}

其他随机发生器

<random> 标头 提供了无数其他具有不同分布类型的随机数生成器,包括伯努利、泊松和正态分布。

我怎样才能洗牌一个容器?

标准提供了 std::shuffle ,可以使用如下:

 #include <iostream>
#include <random>
#include <vector>
int main()
{
    std::vector<int> vec = {4, 8, 15, 16, 23, 42};

    std::random_device random_dev;
    std::mt19937       generator(random_dev());

    std::shuffle(vec.begin(), vec.end(), generator);
    std::for_each(vec.begin(), vec.end(), [](auto i){std::cout << i << '\n';});
}

在 Godbolt 上在线尝试

该算法将随机重新排序元素,具有线性复杂度。

Boost.Random

如果您无法访问 C++11+ 编译器,另一种选择是使用 Boost.Random 。它的界面与 C++11 非常相似。

原文由 Shoe 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 C++11 的最小实现:

 #include <random>

int randrange (int min, int max) {
    static std::random_device rd; // Static in case init is costly
    return std::uniform_int_distribution {min, max} (rd);
}

原文由 gatopeich 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏