Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2012, 16:45   #1
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию Диапазон srand

Уж не пойму почему, но почему нарушается диапазон случайных чисел?

Код:
srand(time(NULL));
rand() % 30000 + 10000;
Может я чего недопонимаю, но диапазон нарушается с верхней границей(30000). Почему так происходит?

Пытался другим способом рандом получить

Код:
10000 + rand() % 30000;
Но проблема это ничего не изменило.

Неужели нет ничего аля rand(10000,30000) ?
L6go1as вне форума Ответить с цитированием
Старый 02.01.2012, 16:50   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от L6go1as Посмотреть сообщение
Уж не пойму почему, но почему нарушается диапазон случайных чисел?

Код:
srand(time(NULL));
rand() % 30000 + 10000;
Может я чего недопонимаю, но диапазон нарушается с верхней границей(30000). Почему так происходит?

Пытался другим способом рандом получить

Код:
10000 + rand() % 30000;
Но проблема это ничего не изменило.

Неужели нет ничего аля rand(10000,30000) ?
http://www.cplusplus.com/reference/c.../cstdlib/rand/

Обрати особое внимание вот на эти две строки:

1. Returns a pseudo-random integral number in the range 0 to RAND_MAX.
2. RAND_MAX is a constant defined in <cstdlib>. Its default value may vary between implementations but it is granted to be at least 32767.


И теперь подумай о том, какой диапазон возвращаемых чисел у rand(), и как его можно расширить.
_Bers вне форума Ответить с цитированием
Старый 02.01.2012, 16:59   #3
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Эм, а теперь на пальцах, почему случайные числа вылазят за установленный диапазон?
L6go1as вне форума Ответить с цитированием
Старый 02.01.2012, 17:09   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от L6go1as Посмотреть сообщение
Эм, а теперь на пальцах, почему случайные числа вылазят за установленный диапазон?
Максимальное рандомное число, которое может быть сгенерировано rand() принадлежит диапазону от 0 до RAND_MAX.

Где, RAND_MAX равно 32767

Если тебе нужны числа из большего диапазона - придётся немножко постараться.
_Bers вне форума Ответить с цитированием
Старый 02.01.2012, 17:24   #5
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Примногоуважаемый _Bers, то что rand() генерирует от 0 и до RAND_MAX, которое равно 32767, я уже понял.

Нужен диапазон в i < 1000, но даже при i < 10, числа генерируется не в рамках заданного диапазона.

По прежнему не понимаю почему так и как исправить.
L6go1as вне форума Ответить с цитированием
Старый 02.01.2012, 17:24   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

RAND_MAX как минимум равно 32767, но может быть и больше, зависит от реализации. У меня это число равно INT_MAX для 32-х битного int, например.
А тот факт, что полученное число выходит за пределы желаемого вами диапазона, весьма очевиден:
rand() % 30000 - получить число от 0 до 30000
+ 10000 - прибавить к нему 10000
результат - число от 10000 до 40000.

нужно так:
rand() % (GREATEST - LEAST) + LEAST
где GREATEST - макс. желаемое число, а LEAST - минимальное
netrino вне форума Ответить с цитированием
Старый 02.01.2012, 17:28   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
У меня это число равно INT_MAX для 32-х битного int, например.
У вас, что за версия библиотеки?
И если есть возможность, можете показать реализацию rand() из вашей библиотеки?
_Bers вне форума Ответить с цитированием
Старый 02.01.2012, 17:34   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

У меня библиотека, поставляемая с gcc 4.6.1 для x64, но тоже верно и для других, более ранних версий, в том числе и для 32-битных.
А зачем Вам реализация?) Если очень интересно, можете скачать из интернета исходники glibc и посмотреть.
netrino вне форума Ответить с цитированием
Старый 02.01.2012, 17:45   #9
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
А тот факт, что полученное число выходит за пределы желаемого вами диапазона, весьма очевиден:
rand() % 30000 - получить число от 0 до 30000
+ 10000 - прибавить к нему 10000
результат - число от 10000 до 40000.

нужно так:
rand() % (GREATEST - LEAST) + LEAST
где GREATEST - макс. желаемое число, а LEAST - минимальное
Благодарю! Помогли, быстро, а главное доходчиво объяснили!
В приведенной статье выше есть пример:

Код:
( value % 100 + 1 ) // is in the range 1 to 100
Собственно, я думал это синтаксис такой, и в данном контексте + не является плюсом как таковым.

По факту программа с приведенным примером покажет диапазон от 1 до 101, именно для этого потом и следует вычесть 1(пример), что бы диапазон был верен.

Но неужели нет более легкого, программного, а не математического решения?
Я ж просто гуманитарий и мне куда логичнее написать rand(min,max);

Есть ли другие пути задачи диапазона?
L6go1as вне форума Ответить с цитированием
Старый 02.01.2012, 17:51   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
int random(int least, int greatest) {
  return rand() % (greatest - least) + least;
}

...

random(0, 10);
random(-10, 10);
...
Так?
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Sleep(1000); srand(time(0)) masashama Общие вопросы C/C++ 10 19.04.2011 16:58
srand Dario Общие вопросы C/C++ 2 16.04.2011 22:39
Srand()-> delphi dosha Общие вопросы C/C++ 3 08.01.2011 14:21
функция srand() Bob Dylan Visual C++ 4 18.08.2010 22:10
Как написать в коде чтобы диапазон А копировался как значение в диапазон В. Dorvir Microsoft Office Excel 12 23.05.2008 22:11