Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Как сгенерировать случайное число на всем диапазоне значений int?

Ответить
Настройки темы
C/C++ - [решено] Как сгенерировать случайное число на всем диапазоне значений int?

Экзорцист


Сообщения: 969
Благодарности: 127

Профиль | Отправить PM | Цитировать


Добрый день.
Необходимо сгенерировать одномерный массив случайных чисел в диапазоне от INT_MIN до INT_MAX. С генерацией массива проблем нет, а как получить случайное число на всем диапазоне значений целочисленного типа int (от INT_MIN до INT_MAX)?
Спасибо

Отправлено: 13:50, 29-05-2009

 

Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить 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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Pliomera

Технолог


Сообщения: 819
Благодарности: 117

Профиль | Отправить PM | Цитировать


Цитата Coutty:
если диапазон от -1000 до 1000, то создаётся число от 0 до 1, умножается на тысячу и на "случайный знак". Правда здесь дополнительное ветвление появляется... »
rand() * 2000 - 1000

PS. В С/С++ ни ухом ни рылом...
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:29, 29-05-2009 | #3


Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить PM | Цитировать


Цитата Pliomera:
rand() * 2000 - 1000 »
Это понятно. А если использовать INT_MAX вместо тысячи? Тогда числа "2000" не будет, т.к. оно выходит за границы диапазона.
Я тоже С/С++ не знаю, но не суть

Отправлено: 20:33, 29-05-2009 | #4


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить 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;
Далее используем генерацию случайных чисел от '0' до '9'

Код: Выделить весь код
#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;
  }
А чтобы отрицательное получить, ну, ещё один рандом прикрутить, с диапазоном значений от '0' до '1', если ноль - значит выполняем положительные числа, если единица - ставим к полученому числу - "—". Будет отрицательное.

В тех местах где я выделил зелёным цветом, слегка запутался, так как в числе 2 147 483 647, может быть и так - 2 047 483 647. Но пока ничего не могу придумать.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Последний раз редактировалось Drongo, 01-06-2009 в 13:10. Причина: Чуть исправил, но всё равно запутался...

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:49, 30-05-2009 | #5


Экзорцист


Сообщения: 969
Благодарности: 127

Профиль | Отправить PM | Цитировать


Спасибо - идея понятна. Вот только с реализацией возник вопрос.
Стандартный int rand(void) возвращает случайное целое число в диапазоне от 0 до RAND_MAX, где RAND_MAX=32767. Если получать случайное число в интервале от 0 до 1 вот таким образом - double(rand())/RAND_MAX, то идеологически это будет верно?

Отправлено: 12:42, 31-05-2009 | #6


Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить PM | Цитировать


Вполне. Можно сразу умножать на (INT_MAX/RAND_MAX). Если часто используется генерация, то сохраните это число как константу.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:00, 31-05-2009 | #7


Экзорцист


Сообщения: 969
Благодарности: 127

Профиль | Отправить PM | Цитировать


А как часто надо проводить инициализацию генератора случайных силел - srand(time(0))? Один раз или каждый раз перед использованием rand()?

Отправлено: 17:06, 31-05-2009 | #8


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Michael:
А как часто надо проводить инициализацию генератора случайных силел - srand(time(0))? Один раз или каждый раз перед использованием rand()? »
Достаточно одного раза.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:52, 31-05-2009 | #9

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


чему в вашей системе равны INT_MIN и INT_MAX?
Цитата Borland RTL Help:
Syntax

#include <stdlib.h>
int rand(void);

Description

Random number generator.

rand uses a multiplicative congruential random number generator with period 2 to the 32nd power to return successive pseudorandom numbers in the range from 0 to RAND_MAX. The symbolic constant RAND_MAX is defined in stdlib.h.
stdlib.h:
Код: Выделить весь код
/* Maximum value returned by "rand" function
*/
#define RAND_MAX  0x7FFFU
Используем идею Drongo»
, только в 2-ичной системе, и представление 32-разрядного int в памяти:
Код: Выделить весь код
  int big_rand = (rand() << 30) | (rand() << 15) | rand();
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:54, 01-06-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Как сгенерировать случайное число на всем диапазоне значений int?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход