如何生成0到1之间的随机数?

use*_*062 21 c

我想在(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,请使用.


Joh*_*ode 7

以下是在指定范围内生成随机数的一般过程:

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序列.

  • 任何人都需要三年时间才能注意到,甚至还有投票权!我一定对所有的括号感到困惑.然而,最初的问题意味着要求在0到1范围内的`double`,这将返回一个`int`."RAND_MAX + 1"也可能溢出. (4认同)
  • 如果问题范围为0到1,则此函数每次都返回零.它应该返回一个双倍.如果需要非整数范围怎么办?无论哪种方式,这都有点超出原始要求. (3认同)
  • @Clifford 这将如何每次都返回 0?`(max-min+1)` 是 `2`,这意味着 `rand()` 位将返回一个数字 `[0-2)`,当用 `(int)` 截断时应该返回 `0` 或 `1 ` 以相同的概率。 (2认同)

小智 1

在我看来,你没有先打电话给 srand 。使用示例在这里