代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

随机浮点数

  •  11
  • Richard Knop  · 技术社区  · 15 年前

    我编写这个函数是为了得到0到0之间的伪随机浮点。。1包括:

    float randomFloat()
    {
          float r = (float)rand()/(float)RAND_MAX;
          return r;
    }
    

    但是,它总是返回0.563585。无论我运行控制台应用程序多少次,都是相同的数字。

    编辑:

    #include <stdio.h>
    #include <stdlib.h>
    
    float randomFloat()
    {
          float r = (float)rand() / (float)RAND_MAX;
          return r;
    }
    
    int main(int argc, char *argv[])
    {
      float x[] = {
            0.72, 0.91, 0.46, 0.03, 0.12, 0.96, 0.79, 0.46, 0.66, 0.72, 0.35, -0.16,
            -0.04, -0.11, 0.31, 0.00, -0.43, 0.57, -0.47, -0.72, -0.57, -0.25,
            0.47, -0.12, -0.58, -0.48, -0.79, -0.42, -0.76, -0.77
      };
    
      float y[] = {
            0.82, -0.69, 0.80, 0.93, 0.25, 0.47, -0.75, 0.98, 0.24, -0.15, 0.01,
            0.84, 0.68, 0.10, -0.96, -0.26, -0.65, -0.97, -0.03, -0.64, 0.15, -0.43,
            -0.88, -0.90, 0.62, 0.05, -0.92, -0.09, 0.65, -0.76      
      };
    
      int outputs[] = {
          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
      };
    
      int patternCount = sizeof(x) / sizeof(int);
    
      float weights[2];
      weights[0] = randomFloat();
      weights[1] = randomFloat();
    
      printf("%f\n", weights[1]);
    
      float learningRate = 0.1;
    
      system("PAUSE");
      return 0;
    }
    
    5 回复  |  直到 11 年前
        1
  •  13
  •   rlbond    15 年前

    你需要打电话

    srand(time(NULL));
    

    使用前 rand 这是第一次。 time <time.h>

    编辑:正如Jonathan Leffler指出的,这很容易预测,所以不要尝试在cryprography中使用它。

        2
  •  10
  •   mjv    15 年前

    C随机发生器是一个 -随机发生器 (顺便说一句,这是一件非常好的事情,有很多应用)。(ANSI C标准要求这种伪随机发生器)

    基本上,每次重新启动控制台应用程序时,都会重新启动它 对随机生成器使用相同的[默认]种子

    通过添加一行

      srand(time(NULL));
    


    :只需调用srand()一次,而不是每次调用rand()之前。

    编辑 :(测试/调试时间提示)
    [来自Artelius的评论] 出于测试目的,最好使用srand(一些常数),并在运行之间更改常量的值。这样,如果一个bug由于一些随机数的组合而表现出来,您就可以复制它。

        3
  •  6
  •   ephemient    15 年前

    drand48 非常适合您的使用,比 (float)rand()/RAND_MAX

    这个 drand48() erand48()

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int main() {
        int i;
    
        srand48(time(NULL));
    
        for (i = 0; i < 10; i++)
            printf("%g\n", drand48());
    
        return 0;
    }
    
        4
  •  2
  •   Lucas    15 年前

    您必须使用初始化随机种子

    void srand ( unsigned int seed );
    

    您可以以系统时间为例。

        5
  •  1
  •   Richard Pennington    15 年前

    你不止一次这样称呼它吗?rand()将始终返回相同的伪随机数。您可能希望使用一些好的种子调用srand(),比如当前时间。