在C++中使用uniform_real_distribution

using uniform_real_distribution in C++

本文关键字:real distribution uniform C++      更新时间:2023-10-16

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

我可以知道我错了什么吗?

提前非常感谢。

编辑1:

====

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

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

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

在取模运算之前用长整型进行算术以避免这种情况。

all

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

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

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

在这种情况下,不再出现负值。

然而,这个问题仍然没有答案:为什么第一篇文章中有负面因素?