|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Как сгенерировать случайное число на всем диапазоне значений int? |
|
|
C/C++ - [решено] Как сгенерировать случайное число на всем диапазоне значений int?
|
Экзорцист Сообщения: 969 |
Профиль | Отправить PM | Цитировать Добрый день.
Необходимо сгенерировать одномерный массив случайных чисел в диапазоне от INT_MIN до INT_MAX. С генерацией массива проблем нет, а как получить случайное число на всем диапазоне значений целочисленного типа int (от INT_MIN до INT_MAX)? Спасибо |
|
Отправлено: 13:50, 29-05-2009 |
Кот Ти Сообщения: 7318
|
Профиль | Отправить PM | Цитировать Генерируете случайное число с плавающей точкой от 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 ) |
Отправлено: 16:59, 29-05-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Технолог Сообщения: 819
|
Профиль | Отправить PM | Цитировать Цитата Coutty:
PS. В С/С++ ни ухом ни рылом... |
|
Отправлено: 20:29, 29-05-2009 | #3 |
Кот Ти Сообщения: 7318
|
Профиль | Отправить PM | Цитировать Цитата Pliomera:
Я тоже С/С++ не знаю, но не суть |
|
Отправлено: 20:33, 29-05-2009 | #4 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать В общем есть кое-какая идея, почти сумасбродная и имеющая некий изврат, но вполне работоспособная при правильном подходе. Изложу суть.
У нас INT_MAX = 2 147 483 647 (в числе 10 цифр и не больше). Используем несколько масивов ... int array1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // Единицы int array2[10] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90}; // Десятки int array3[10] = {0, 100, 200, 300, 400, 500, 600, 700, 800, 900}; // Сотни int array4[10] = {0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000}; // Тысячи int array5[10] = {0, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000}; // Десятки тысяч int array6[10] = {0, 100000, 200000, 300000, 400000, 500000, 600000, 700000, 800000, 900000}; // Сотни тысяч int array7[10] = {0, 1000000, 2000000, 3000000, 4000000, 5000000, 6000000, 7000000, 8000000, 9000000}; // Миллион int array8[10] = {0, 10000000, 20000000, 30000000, 40000000, 50000000, 60000000, 70000000, 80000000, 90000000}; // Десятки миллионов int array9[10] = {0, 100000000}; // Сотни миллионов. Потому что в значении 2 147 483 647. Максимальное. int array10[10] = {0, 100000000, 200000000}; // Миллиард. Потому что в значении 2 147 483 647. Максимальное. int array_rand[size] = {0}; // Массив куда будем записывать числа (от INT_MIN до INT_MAX) int index1, index2, index3, index4, index5, index6, index7, index8, index9, index10, SumNumber; #include <stdlib.h> #include <ctime.h> using std::time; ... srand(time(0)); for(int i = 0; i < size; i++){ index1 = rand() % 9; // Значения от '0' до '9' Всего 10 значений. Для индекса массива. index2 = rand() % 9; index3 = rand() % 9; index4 = rand() % 9; index5 = rand() % 9; index6 = rand() % 9; index7 = rand() % 9; index8 = rand() % 9; index9 = rand() % 1; index10 = rand() % 2; ... // Проверяем, чтобы 2 147 483 647 не вышел за диапазон значения if(index10 == 2){ // Проверяем, чтобы 2 147 483 647 не вышел за диапазон значения. if(index9 == 1){ // Выполняем суммирование только для этих случаев SumNumber = array10[index10] + array9[index9] + array8[index8] ... + ... array2[index2] + array1[index1]; } } .... // В итоге и правильном алгоритме, мы получаем SumNumber = array10[index10] + array9[index9] + array8[index8] ... + ... array2[index2] + array1[index1]; array_rand[i] = SumNumber; } В тех местах где я выделил зелёным цветом, слегка запутался, так как в числе 2 147 483 647, может быть и так - 2 047 483 647. Но пока ничего не могу придумать. |
|
------- Последний раз редактировалось Drongo, 01-06-2009 в 13:10. Причина: Чуть исправил, но всё равно запутался... Отправлено: 09:49, 30-05-2009 | #5 |
Экзорцист Сообщения: 969
|
Профиль | Отправить PM | Цитировать Спасибо - идея понятна. Вот только с реализацией возник вопрос.
Стандартный int rand(void) возвращает случайное целое число в диапазоне от 0 до RAND_MAX, где RAND_MAX=32767. Если получать случайное число в интервале от 0 до 1 вот таким образом - double(rand())/RAND_MAX, то идеологически это будет верно? |
Отправлено: 12:42, 31-05-2009 | #6 |
Кот Ти Сообщения: 7318
|
Профиль | Отправить PM | Цитировать Вполне. Можно сразу умножать на (INT_MAX/RAND_MAX). Если часто используется генерация, то сохраните это число как константу.
|
Отправлено: 13:00, 31-05-2009 | #7 |
Экзорцист Сообщения: 969
|
Профиль | Отправить PM | Цитировать А как часто надо проводить инициализацию генератора случайных силел - srand(time(0))? Один раз или каждый раз перед использованием rand()?
|
Отправлено: 17:06, 31-05-2009 | #8 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Michael:
|
|
------- Отправлено: 18:52, 31-05-2009 | #9 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать чему в вашей системе равны INT_MIN и INT_MAX?
Цитата Borland RTL Help:
Используем идею Drongo» , только в 2-ичной системе, и представление 32-разрядного int в памяти: |
|
Отправлено: 07:54, 01-06-2009 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Batch файл (.bat, .cmd) - как сгенерировать произвольное число от 1 до 10? | ANR | Скриптовые языки администрирования Windows | 9 | 26-03-2013 10:02 | |
[решено] Как сделать,что б батник проверял число ? | mitiya | Автоматическая установка Windows 2000/XP/2003 | 27 | 28-01-2010 08:15 | |
CMD/BAT - [решено] Как создать бат, чтобы проверял число месяца? | Ingolder | Скриптовые языки администрирования Windows | 7 | 07-12-2009 21:28 | |
КАк сгенерировать доки? | axax | Вебмастеру | 2 | 04-04-2006 19:49 | |
Как перевсти char в int? | Sage | Программирование и базы данных | 4 | 27-03-2003 09:44 |
|