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

时间:2011-06-02 18:04:05

标签: c

我想在(0,1)之间生成随机数。我正在尝试以下方法:

double r2()
{
    return((rand() % 10000) / 10000.0);
}

int SA()
{
    double u;
    u = r2();
}

但它不会产生预期的结果。我该如何解决?

6 个答案:

答案 0 :(得分:26)

在您的版本rand() % 10000中,将生成09999之间的整数。由于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;
}