0

我正在尝试在 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
}

问题是,虽然我已经明确指定随机数在0和内是均匀分布的max_index,但我的数组中仍然有一些负数。而且他们的价值观是一样的(-2432)

我可以知道我错了吗?

提前谢谢了。

编辑1:

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

恐怕许多回复者都在为乘法和模运算而苦苦挣扎。这是一个错误,我已经删除了它。但关键是,即使这会在语义上影响结果,也不能让生成器给出否定的结果。

4

2 回答 2

0

全部

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

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

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

在这种情况下,没有更多的负值出现。

然而,这个问题仍然没有得到解答:为什么在第 1 篇文章中有负面影响?

于 2013-09-05T13:05:50.997 回答
0

这是因为(max_index-1)**2 = 2367211716 > 2**31 - 1。任何大于 44136 的值在乘以 时都会导致有符号整数溢出max_index-1。这大约是您生成的随机数的 9%。

使用 long 进行算术运算,直到模运算之后才能避免这种情况。

于 2013-09-05T16:58:24.527 回答