【问题标题】:generate random float number ranging [0,1] in c在c中生成范围为[0,1]的随机浮点数
【发布时间】:2016-04-20 19:08:32
【问题描述】:

当我使用 rand()srand() 在 [0,1] 中生成随机数时,它给了我这样的数字:0.70324、0.70328、0.70321...

它们仅在最后一位或两位数字上有所不同,而我的目的是获得随机浮点数,例如 0.1,0.7,0.3....

我怎样才能得到这样的随机浮点数,而不是在最后一位上产生差异?

这是我的代码:

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(){
    int i;
    float randomNum;
    for (  i=0; i<10; i++){
        srand((unsigned int)time(NULL));
        randomNum = ((float)rand())/RAND_MAX;
        printf("%f\n",randomNum);
     }
    return 0;
}

【问题讨论】:

  • srand移到循环外。在程序开始时调用一次。您不断重置 RNG,以一秒为粒度。
  • 旁注:我很少看到需要范围[0.0 to 1.0],但范围[0.0 1.0)(不包括1.0)
  • 注意:对于典型的 32 位 int 和 32 位 float((float)rand())/RAND_MAX; 不会提供相同的 float 值。由于(float)rand() 的四舍五入,1.0f 的出现频率是0.0f 的 64 倍
  • 这能回答你的问题吗? srand() — why call it only once?

标签: c random srand


【解决方案1】:

您应该只在程序开始时调用一次srand()。在每次调用 rand() 之前调用它只会使结果更可预测,因为每次调用它时使用的数字可能与前一个非常相似。

【讨论】:

    【解决方案2】:

    移动线

    srand((unsigned int)time(NULL));
    

    到程序的开始,即在main之后。

    您只需为随机数生成器播种一次。

    【讨论】:

      【解决方案3】:

      srand() 仅使用提供给它的一段数据(称为种子)初始化伪随机数生成器。然后rand() 函数使用这个种子来产生随机数。之后,对rand() 的每次调用都基于之前生成的随机数。无论如何,您不打算多次致电srand()。 (您实际上可以在rand's implementation 之一中看到这种行为)

      这里的问题是time()为单位给你当前时间,所以当你初始化生成器并每次调用rand()时你会得到相同的数字,直到一秒通过。

      【讨论】:

        猜你喜欢
        • 2015-10-10
        • 1970-01-01
        • 2013-12-20
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-30
        相关资源
        最近更新 更多