我试图在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)
。
我可以知道我错了吗?
非常感谢提前。
EDIT1:
=============================================== ====================
我担心许多回复者正在努力进行乘法运算和模运算。这是一个错误,我已经删除了它。 但重点是,即使这可能在语义上影响结果,也不会使生成器产生负面结果。
答案 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%。
在模数运算之后直到你的算术才能避免这种情况。