在C++中使用uniform_real_distribution
using uniform_real_distribution in C++
我正在尝试在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:
====
======================================================================恐怕许多回复者都在为乘法和模运算而苦苦挣扎。这是一个错误,我已经删除了它。但关键是,即使这在语义上会影响结果,它也不能使生成器给出负面结果。
这是因为(max_index-1)**2 = 2367211716 > 2**31 - 1
. 任何大于 44136 的值都会导致有符号的 int 在乘以 max_index-1
时溢出。这大约是您生成的随机数的 9%。
在取模运算之前用长整型进行算术以避免这种情况。
all
感谢您的回答。我真的很感激。
现在,我对我的代码进行了一些更改,如下所示
ind[i] = abs(int(distribution(mt)));
在这种情况下,不再出现负值。
然而,这个问题仍然没有答案:为什么第一篇文章中有负面因素?
相关文章:
- 点运算符 (.) 是"real"运算符吗?
- 常量参数"real"常量吗?
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 在调试中,如何知道对函数的重复调用中参数的统计数据(max-min,average,distribution..)
- Box muller distribution
- QML/real和C++/float之间的Qt类型错误
- 在日食中获取无法执行 g++.real 错误
- 了解"Real world modelling"程序
- 使用 BER 编码和解码 ASN.1 REAL
- LLVM Callinst 函数如何获取 (real)Name
- boost::math::p df(distribution, value) 是否使用查找表或在每次调用时计算 exp(
- <double> 复杂C++ - 不能使用 imag()、complex()、real()
- 实现QProcess的最佳方法是什么,在"real time"中读取stdout和stderr?
- Dirichlet distribution with RcppGSL
- 如何查找"real"错误?
- 关于渲染系统架构布局的建议-Real time/HLSL/DirectX9/ c++
- MPI distribution layer
- SQLite文本转换为整数或REAL在c++做太多