我想在(0,1)之间生成随机数.我正在尝试以下方法:
double r2()
{
return((rand() % 10000) / 10000.0);
}
int SA()
{
double u;
u = r2();
}
Run Code Online (Sandbox Code Playgroud)
但它不会产生预期的结果.我该如何解决?
Cli*_*ord 29
在您的版本rand() % 10000中将产生一个介于0和之间的整数9999.由于RAND_MAX可能小到32767,并且因为它不能被10000整除,并且相对于10000不大,所以结果的"随机性"将存在显着偏差,而且,最大值将为0.9999,而不是1.0 ,并且您不必要地将您的值限制为四位小数.
它是简单的算术,随机数除以最大可能的随机数将产生从0到1的数字,同时利用RNG的全分辨率和分布
double r2()
{
return (double)rand() / (double)RAND_MAX ;
}
Run Code Online (Sandbox Code Playgroud)
(double)rand() / (double)((unsigned)RAND_MAX + 1)如果有意排除1.0,请使用.
以下是在指定范围内生成随机数的一般过程:
int randInRange(int min, int max)
{
return min + (int) (rand() / (double) (RAND_MAX + 1) * (max - min + 1));
}
Run Code Online (Sandbox Code Playgroud)
根据PRNG算法被使用时,%操作者可导致非常非数字-random序列.