随机浮点数

我编写了这个函数来获得0 … 1之间的伪随机浮点数:

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

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

编辑:

如果需要,这是我的整个申请:

 #include  #include  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; } 

你需要打电话

 srand(time(NULL)); 

在第一次使用rand之前。 time

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

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

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

通过添加一行代码

  srand(time(NULL)); 

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

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

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

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

 #include  #include  #include  int main() { int i; srand48(time(NULL)); for (i = 0; i < 10; i++) printf("%g\n", drand48()); return 0; } 

你必须初始化随机种子

 void srand ( unsigned int seed ); 

您可以采用例如系统时间。

你不止一次打电话吗? rand()将始终返回相同的伪随机数。 你可能想用一些漂亮的种子调用srand(),比如当前时间。