首页 > 解决方案 > 在 -100000 和 100000 之间生成 10000 个随机整数

问题描述

我想生成一个n整数数组,范围minnmaxx. n=10000当,minn=0和时一切正常maxx=100000,但是当n=10000,minn=-100000maxx=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;
}

我怎样才能解决这个问题?

标签: c++

解决方案


fmod((unsigned)rand(),(maxx-minn+1))+minn不会为你产生好的结果。

rand()返回 和 之间0的值RAND_MAXRAND_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);

这应该会在您的范围内为您提供高质量随机数的均匀分布,并且应该适用于 和 的任何minnmaxx


推荐阅读