![]() |
Как сгенерировать случайное число на всем диапазоне значений int?
Добрый день.
Необходимо сгенерировать одномерный массив случайных чисел в диапазоне от INT_MIN до INT_MAX. С генерацией массива проблем нет, а как получить случайное число на всем диапазоне значений целочисленного типа int (от INT_MIN до INT_MAX)? Спасибо |
Генерируете случайное число с плавающей точкой от 0 до 1 стандартным способом. Умножаете на (INT_MAX минус INT_MIN), округляете и прибавляете INT_MIN.
Это первое, что приходит в голову. Возможно, есть специальная функция. P.S. Похоже, я немного неверно понял задание. Алгоритм был написан для генерации числа, скажем от 100 до 500. А если от 0 до "условно 1000", то просто произвольное от 0 до 1 умножить на 1000. Второе дополнение: если диапазон от -1000 до 1000, то создаётся число от 0 до 1, умножается на тысячу и на "случайный знак". Правда здесь дополнительное ветвление появляется... Что-то вроде этого: rand() * 1000 * ( (rand() >= 0.5) ? 1 : -1 ) |
Цитата:
PS. В С/С++ ни ухом ни рылом... |
Цитата:
Я тоже С/С++ не знаю, но не суть :) |
В общем есть кое-какая идея, почти сумасбродная и имеющая некий изврат, :whitevoid: но вполне работоспособная при правильном подходе. Изложу суть.
У нас INT_MAX = 2 147 483 647 (в числе 10 цифр и не больше). Используем несколько масивов Код:
... Код:
#include <stdlib.h> В тех местах где я выделил зелёным цветом, слегка запутался, так как в числе 2 147 483 647, может быть и так - 2 047 483 647. Но пока ничего не могу придумать. :durak: |
Спасибо - идея понятна. Вот только с реализацией возник вопрос.
Стандартный int rand(void) возвращает случайное целое число в диапазоне от 0 до RAND_MAX, где RAND_MAX=32767. Если получать случайное число в интервале от 0 до 1 вот таким образом - double(rand())/RAND_MAX, то идеологически это будет верно? |
Вполне. Можно сразу умножать на (INT_MAX/RAND_MAX). Если часто используется генерация, то сохраните это число как константу.
|
А как часто надо проводить инициализацию генератора случайных силел - srand(time(0))? Один раз или каждый раз перед использованием rand()?
|
Цитата:
|
чему в вашей системе равны INT_MIN и INT_MAX?
Цитата:
Код:
/* Maximum value returned by "rand" function , только в 2-ичной системе, и представление 32-разрядного int в памяти: Код:
int big_rand = (rand() << 30) | (rand() << 15) | rand(); |
Цитата:
pva, Я правильно понял, что ваш код, всего одна строка Цитата:
|
pva, INT_MAX=2147483647, INT_MIN=-2147483648
Drongo, не, я там про другую реализацию говорил - все вышеописанное опиралось на сгенерированное случайное число в интервале от 0 до 1, а стандартный int rand(void) возвращает случайное целое число в диапазоне от 0 до 32767. И меня интересовало, если получать случайное число в интервале от 0 до 1 следующим образом - double(rand())/RAND_MAX, то будет ли это верно с точки зрения идеологии программирования. |
Интересные вы =)))
Код:
|
Цитата:
Код:
(rand() << 30) | (rand() << 15) | rand(); Вариант Цитата:
так же не годится вариант Цитата:
|
Допустим что у нас есть функция rnd(), которая возвращает случайное, равномерно распределённое число в диапазоне от rnd_min до rnd_max.
Наша задача: написать функцию my_rnd(), которая будет возвращать случайное, равномерно распределённое число в диапазоне от my_min до my_max. Решение: 1. Для начала мы приведём имеющееся у нас случайное число к интервалу [0, 1]: Код:
float tmp_rnd = float(rnd() - rnd_min) / (rnd_max - rnd_min); Код:
my_int result = tmp_rnd * (my_max - my_min) + my_min; Код:
return result; Цитата:
2. конструкция Код:
rand() % (max- min + 1) + min; |
Время: 18:41. |
Время: 18:41.
© OSzone.net 2001-