Подтвердить что ты не робот

Как создать случайное число от 0 до 1?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Установите семя, используя 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

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

Ответ 5

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

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

double r2()
{
     srand(time(NULL));
     return(rand() % 2);
}