Случайное вещественное число

Я написал эту функцию, чтобы получить псевдо-случайный float между 0 .. 1 включительно:

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

однако он всегда возвращается 0.563585. Один и тот же номер независимо от того, сколько раз я запускаю свое консольное приложение.

EDIT:

вот все мое приложение, если необходимо:

#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("%fn", weights[1]);

  float learningRate = 0.1;

  system("PAUSE");
  return 0;
}

5 ответов


нужно позвонить

srand(time(NULL));

перед использованием rand впервые. time находится в <time.h>.

EDIT: как указывает Джонатан Леффлер, это легко предсказать, поэтому не пытайтесь использовать его для крипрографии.


потому что генератор случайных чисел C является псевдо-генератор случайных чисел (и это, кстати, очень хорошо, со многими приложениями). (Стандарт ANSI C требует такого псевдослучайного генератора)

по существу каждый раз, когда ваше консольное приложение перезапускается использует то же самое [по умолчанию] семя для случайного генератора.

добавить строку

  srand(time(NULL));

вы получите определенное семя каждый раз, и последовательность номера произведенного с меняет соответственно.
Примечание: вам нужно только вызвать srand () один раз, а не перед каждым вызовом rand ().

редактировать: (test / Debug-time hint)
[из замечание Artelius] Для целей тестирования лучше всего использовать srand (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 () с некоторым хорошим семенем, например, в текущее время.