c++ - 在 -100000 和 100000 之间生成 10000 个随机整数
问题描述
我想生成一个n
整数数组,范围minn
为maxx
. n=10000
当,minn=0
和时一切正常maxx=100000
,但是当n=10000
,minn=-100000
和maxx=100000
程序只生成负数。这是生成我的数字的函数:
#include <iostream>
#include <random>
int n, minn, maxx;
int* v=new int[100000000];
void generare_sir(int n, int* v, int minn, int maxx, std::string caz_particular)
{
srand((unsigned)time(0));
for(int i=0; i<n; i++)
{
v[i]=fmod((unsigned)rand(),(maxx-minn+1))+minn;
cout<<i<<" "<<v[i]<<"\n";
}
}
int main()
{
cout<<"n=";
cin>>n;
cout<<"minn=";
cin>>minn;
cout<<"maxx=";
cin>>maxx;
generare_sir(n, v, minn, maxx, caz_particular);
return 0;
}
我怎样才能解决这个问题?
解决方案
fmod((unsigned)rand(),(maxx-minn+1))+minn
不会为你产生好的结果。
rand()
返回 和 之间0
的值RAND_MAX
。RAND_MAX
在某些平台上非常小,例如在 Visual Studio 中是32767
.
随着maxx-minn + 1
存在200,001
,在视觉工作室rand()/maxx-minn + 1
中将产生 0 和0.163
. 由于这不超过1
的结果fmod
也将介于0
和之间0.163
。每次都添加回minn
整数并截断为整数。minn
你会得到更好的结果:
v[i] = static_cast<int>(static_cast<double>(rand()) / RAND_MAX * (maxx-minn + 1) + minn);
但是请注意,这种随机性会很差,只会RAND_MAX
产生不同的数字,并且数字在整个范围内的分布不一定是均匀的。
最好的解决方案是使用 c++11随机库(您已经包含在代码中):
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(minn, maxx);
...
v[i] = dis(gen);
这应该会在您的范围内为您提供高质量随机数的均匀分布,并且应该适用于 和 的任何minn
值maxx
。
推荐阅读
- php - 干预图像库 - 每当上传错误的图像格式时,我希望能够捕获它并将其发送到 Laravel 的前端
- web - 登录后无法拉取用户对象并将其导航到主页
- python - 如何使用 tkinter 在 python 中的现有框架内创建可滚动框架
- javascript - .env webpack 传递环境变量的值,但应用程序不起作用
- r - 在 R 中合并 2 while 语句
- r - 方差分析检验 p 值 - R
- sql - 元数据库 - 建立与数据库的连接时运行初始化 SQL
- hyperledger-fabric - 私人通道状态或区块是否添加到主分类账中?
- python - 如何将用户限制为最多三个错误的 otp 条目
- python - 将列表列表(用逗号分隔的语句)展平为列表列表