生成100000到100000之间的10000个随机整数



我想生成一个nint数组,范围为minnmaxx。当n=10000minn=0maxx=100000时,一切都很好,但当n=10000minn=-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;
}

我该怎么解决这个问题?

fmod((unsigned)rand(),(maxx-minn+1))+minn不会为您带来好的结果。

CCD_ 11返回介于0RAND_MAX之间的值。RAND_MAX在某些平台上相当小,例如在visual studio中它是32767

maxx-minn + 1200,001时,在visual studio中,rand()/maxx-minn + 1将生成0到0.163之间的值。由于这不大于1,所以fmod的结果也将在00.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的任何值。

尝试使用

void generare_sir(int n, int* v, int minn, int maxx)
{
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(minn,maxx);
generator.seed(time(0));
for(int i=0; i<n; i++)
{
v[i] = distribution(generator);
cout<<i<<" "<<v[i]<<"n";
}
}

一点解释:原始代码除了最小值和最大值之外没有任何问题。rand((可以生成一个介于0和rand_MAX之间的数字。RAND_MAX在库中定义为常量,其值通常为32767(0x7FFF(。除非更改库,否则无法更改它。如果你从这个随机数中减去100000,你总是会得到负数。你需要一种生成数字的替代方法。有关更多随机信息,您可以查看:http://www.cplusplus.com/reference/random/首先你要创建一个数字生成器,然后选择一个分配方法并最终对其进行种子处理

最新更新