-
18-09-2019 - |
题
我编写了此功能以在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;
}
解决方案
你需要打电话
srand(time(NULL));
使用之前 rand
首次。 time
在 <time.h>
.
编辑:正如乔纳森·莱夫勒(Jonathan Leffler)指出的那样,这很容易预测,因此请勿尝试将其用于crypragrapragrapragra。
其他提示
那是因为 C随机生成器是一个 伪- 随机发电机 (顺便说一句,有很多应用程序)。 (ANSI C标准需要这样的伪随机发电机)
本质上,每次您的控制台应用程序都重新启动 为随机生成器使用相同的[默认]种子.
通过添加类似的行
srand(time(NULL));
您每次都会得到一个独特的种子,而与相应的数字序列则相应。
笔记: :您只需要一次致电Srand()一次,而不是每次致电Rand()之前。
编辑: :(测试/调试时间提示)
从Artelius的评论中]出于测试目的,最好是SRAND(SONE_CONST),并更改运行之间常数的值。这样,如果由于随机数的某种组合而表现出来,您将能够复制它。
Drand48 非常适合您的使用,比 (float)rand()/RAND_MAX
, , 因为
这
drand48()
和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;
}
您必须用
void srand ( unsigned int seed );
您可以以系统时间为例。
您称其不止一次吗?兰德()将始终返回相同的伪随机。您可能需要用一些不错的种子来调用Srand(),例如当前时间。
不隶属于 StackOverflow