11

我编写了这个函数来获得 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;
}
4

5 回答 5

13

你需要打电话

srand(time(NULL));

rand在第一次使用之前。time<time.h>.

编辑:正如 Jonathan Leffler 指出的那样,这很容易预测,所以不要尝试将它用于加密。

于 2009-11-07T23:44:05.657 回答
10

那是因为C 随机生成器是一个随机生成器(也就是说,顺便说一句,一个非常好的东西,有很多应用程序)。(ANSI C 标准需要这样一个伪随机生成器)

基本上每次重新启动控制台应用程序时,它都会使用相同的 [default] 种子作为 random generator

通过添加一行

  srand(time(NULL));

每次你都会得到一个不同的种子,并且产生的数字序列会相应变化。
注意:您只需要调用 srand() 一次,而不是在每次调用 rand() 之前。

编辑:(测试/调试时提示)
[来自 Artelius 的评论]出于测试目的,最好使用 srand(SOME_CONST),并在运行之间更改常量的值。这样,如果由于某种随机数组合而出现错误,您将能够重现它。

于 2009-11-07T23:45:12.783 回答
6

drand48非常适合您的使用,优于(float)rand()/RAND_MAX,因为

drand48()and函数返回非负的erand48()双精度浮点值,均匀分布在区间 [0.0 , 1.0] 上。

#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;
}
于 2009-11-08T00:09:26.467 回答
2

你必须初始化一个随机种子

void srand ( unsigned int seed );

您可以以系统时间为例。

于 2009-11-07T23:45:44.603 回答
1

你不止一次调用它吗?rand() 将始终返回相同的伪随机数。您可能想用一些不错的种子调用 srand() ,例如当前时间。

于 2009-11-07T23:46:46.490 回答