在C ++中使用uniform_real_distribution

时间:2013-09-05 12:24:45

标签: c++ random

我试图在C ++中使用uniform_real_distribution来生成一个随机数组。这是我的代码

#include <random>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int max_index = 48655;
    vector<int> arr;
    arr.resize(100);

    std::random_device radm;
    std::mt19937_64 mt(radm());
    std::uniform_real_distribution<> distribution(0, max_index);

    for(int i = 0; i < 100; i++)
    {
        arr[i] = int(distribution(mt)*(max_index-1))%(max_index-1);
    }
    return 0
}

问题是,虽然我已明确指出随机数在0max_index内均匀分布,但我的数组中仍有一些负数。它们的值相同(-2432)

我可以知道我错了吗?

非常感谢提前。

EDIT1:

=============================================== ====================

我担心许多回复者正在努力进行乘法运算和模运算。这是一个错误,我已经删除了它。 但重点是,即使这可能在语义上影响结果,也不会使生成器产生负面结果。

2 个答案:

答案 0 :(得分:0)

所有

感谢您的回答。我真的很感激。

现在,我对代码进行了一些更改,如下所示

ind[i] = abs(int(distribution(mt)));

在这种情况下,不会出现更多负值。

然而,这个问题仍然没有答案:为什么在第一次发布会有负面消息?

答案 1 :(得分:0)

这是因为(max_index-1)**2 = 2367211716 > 2**31 - 1。当您将其乘以max_index-1时,任何大于44136的值都将导致signed int溢出。这大约是您生成的随机数的9%。

在模数运算之后直到你的算术才能避免这种情况。