我想在(0,1)之间生成随机数。我正在尝试以下方法:
double r2()
{
return((rand() % 10000) / 10000.0);
}
int SA()
{
double u;
u = r2();
}
但它不会产生预期的结果。我该如何解决?
答案 0 :(得分:26)
在您的版本rand() % 10000
中,将生成0
和9999
之间的整数。由于RAND_MAX可能小到32767,并且因为它不能完全被10000整除而且相对于10000不大,所以结果的“随机性”将存在显着偏差,而且,最大值将为0.9999,而不是1.0 ,并且您不必要地将您的值限制为四位小数。
这是简单的算术,随机数除以最大可能的随机数将产生从0到1的数字,包括RNG的全分辨率和分布
double r2()
{
return (double)rand() / (double)RAND_MAX ;
}
如果故意排除1.0,请使用(double)rand() / (double)((unsigned)RAND_MAX + 1)
。
答案 1 :(得分:6)
以下是在指定范围内生成随机数的一般过程:
int randInRange(int min, int max)
{
return min + (int) (rand() / (double) (RAND_MAX + 1) * (max - min + 1));
}
根据所使用的PRNG算法,%
运算符可能会产生非常非 - 随机数字序列。
答案 2 :(得分:1)
在我看来,你没有先打电话。 用法示例here。
答案 3 :(得分:0)
使用srand()设置种子。此外,您没有在rand()中指定最大值,因此它使用RAND_MAX。我不确定它是否真的是10000 ...为什么不指定它。虽然,我们不知道你的“预期结果”是什么。这是一个随机数发生器。你有什么期待,你看到了什么?
如另一条评论中所述,SA()未明确返回任何内容。
http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html http://www.thinkage.ca/english/gcos/expl/c/lib/rand.html
编辑:
来自Generating random number between [-1, 1] in C?
((float)rand())/RAND_MAX
返回[0,1]
答案 4 :(得分:-1)
你有没有尝试过:replace((rand()%10000)/ 10000.0),用:( rand()%2)。这对我有用!
所以你可以这样做:
double r2()
{
srand(time(NULL));
return(rand() % 2);
}
答案 5 :(得分:-1)
double r2()
{
return (rand() % 10001) / 10000.0;
}