Я хочу генерировать случайные числа между (0,1). Я пытаюсь сделать следующее:
double r2()
{
return((rand() % 10000) / 10000.0);
}
int SA()
{
double u;
u = r2();
}
Но он не генерирует ожидаемый результат. Как я могу это исправить?
Я хочу генерировать случайные числа между (0,1). Я пытаюсь сделать следующее:
double r2()
{
return((rand() % 10000) / 10000.0);
}
int SA()
{
double u;
u = r2();
}
Но он не генерирует ожидаемый результат. Как я могу это исправить?
В вашей версии 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 было намеренным.
Здесь приведена общая процедура для создания случайного числа в указанном диапазоне:
int randInRange(int min, int max)
{
return min + (int) (rand() / (double) (RAND_MAX + 1) * (max - min + 1));
}
В зависимости от используемого алгоритма PRNG оператор %
может привести к очень неслучайной последовательности чисел.
Мне кажется, что вы сначала не называли srand. Пример использования здесь.
Установите семя, используя 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]
Вы пробовали с: replace ((rand()% 10000)/10000.0), с: (rand()% 2). Это сработало для меня!
Итак, вы можете сделать что-то вроде этого:
double r2()
{
srand(time(NULL));
return(rand() % 2);
}