我想生成一个n
int数组,范围为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
不会为您带来好的结果。
CCD_ 11返回介于0
和RAND_MAX
之间的值。RAND_MAX
在某些平台上相当小,例如在visual studio中它是32767
。
maxx-minn + 1
为200,001
时,在visual studio中,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
的任何值。
尝试使用
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/首先你要创建一个数字生成器,然后选择一个分配方法并最终对其进行种子处理