Как сгенерировать случайное число от 0 до 1? - PullRequest
20 голосов
/ 02 июня 2011

Я хочу генерировать случайные числа между (0,1). Я пытаюсь следующее:

double r2()
{
    return((rand() % 10000) / 10000.0);
}

int SA()
{
    double u;
    u = r2();
}

Но это не дает ожидаемого результата. Как я могу это исправить?

Ответы [ 6 ]

27 голосов
/ 02 июня 2011

В вашей версии rand() % 10000 даст целое число от 0 до 9999.Так как RAND_MAX может быть всего 32767, и поскольку это не точно делится на 10000 и не является большим относительно 10000, в «случайности» результата будет существенное смещение, более того, максимальное значение будет 0,9999, а не 1,0и вы излишне ограничили свои значения четырьмя десятичными разрядами.

Это простая арифметика, случайное число, разделенное на максимально возможное случайное число, даст число от 0 до 1 включительно, при этом используется полное разрешение ираспределение ГСЧ

double r2()
{
    return (double)rand() / (double)RAND_MAX ;
}

Используйте (double)rand() / (double)((unsigned)RAND_MAX + 1), если исключение 1,0 было преднамеренным.

7 голосов
/ 02 июня 2011

Вот общая процедура для генерации случайного числа в указанном диапазоне:

int randInRange(int min, int max)
{
  return min + (int) (rand() / (double) (RAND_MAX + 1) * (max - min + 1));
}

В зависимости от используемого алгоритма PRNG оператор % может привести к очень не - случайная последовательность чисел.

1 голос
/ 02 июня 2011

Мне кажется, вы сначала не звонили srand. Пример использования здесь .

0 голосов
/ 04 июля 2019
double r2()
{
   return (rand() % 10001) / 10000.0;
}
0 голосов
/ 09 августа 2017

Пробовали ли вы с: замена ((rand ()% 10000) / 10000.0), на: (rand ()% 2) Это сработало для меня!

Так что вы можете сделать что-то вроде этого:

double r2()
{
     srand(time(NULL));
     return(rand() % 2);
}
0 голосов
/ 02 июня 2011

Установите семя, используя srand ().Кроме того, вы не указываете максимальное значение в rand (), поэтому оно использует RAND_MAX.Я не уверен, если это на самом деле 10000 ... почему бы просто не указать это.Хотя мы не знаем, каковы ваши "ожидаемые результаты".Это генератор случайных чисел.Чего вы ожидаете и что видите?

Как отмечено в другом комментарии, SA () ничего не возвращает явно.

http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html http://www.thinkage.ca/english/gcos/expl/c/lib/rand.html

Редактировать: С Генерация случайного числа между [-1, 1] в C? ((float)rand())/RAND_MAX возвращает число с плавающей запятой в [0,1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...