如何生成0到1之间的随机数?
我想在(0,1)之间生成随机数。 我正在尝试以下方面:
double r2() { return((rand() % 10000) / 10000.0); } int SA() { double u; u = r2(); }
但它不会产生预期的结果。 我该如何解决?
在您的版本中, 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)
。
以下是在指定范围内生成随机数的一般过程:
int randInRange(int min, int max) { return min + (int) (rand() / (double) (RAND_MAX + 1) * (max - min + 1)); }
根据所使用的PRNG算法, %
运算符可能导致非常非随机的数字序列。
在我看来,你没有先调用srand。 这里的用法示例。
使用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
编辑:从C中生成[-1,1]之间的随机数? ((float)rand())/RAND_MAX
在[0,1]中返回一个浮点数
您是否尝试过:replace((rand()%10000)/ 10000.0),用:( rand()%2)。 这对我有用!
所以你可以这样做:
double r2() { srand(time(NULL)); return(rand() % 2); }