Случайное число плавания
-
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>
.
РЕДАКТИРОВАТЬ: Как указывает Джонатан Леффлер, это легко предсказать, поэтому не пытайтесь использовать его для Cryprography.
Другие советы
Это потому Случайный генератор C является псевдо-Рандомер генератор (И это, кстати, очень хорошая вещь, со многими приложениями). (Стандарт ANSI C требует такого псевдолудочного генератора)
По сути, каждый раз, когда ваше приложение для консоли вновь запускается Использует то же самое семена для случайного генератора.
добавив линию как
srand(time(NULL));
Вы будете получать отчетливое семя каждый раз, и последовательность числа, полученная с соответствующим образом.
Примечание: Вам нужно позвонить в srand () только один раз, а не каждый раз, когда вы называете Rand ().
Редактировать: (Подсказка на время теста/отладки)
Из замечания Artelius] для целей тестирования лучше всего (some_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 );
Вы можете взять, например, системное время.
Вы называете это более одного раза? rand () всегда вернет один и тот же псевдо случайный. Возможно, вы захотите позвонить Srand () с хорошим семенем, например, текущее время.