Что такое «рандомный/рандомно»? Что означает понятие «рандомно»?

Какой ГПСЧ является хорошим?

Как мы уже говорили, генератор случайных чисел, который мы написали выше, не является очень хорошим. Сейчас рассмотрим почему.

Хороший ГПСЧ должен иметь ряд свойств:

Свойство №1:ГПСЧ должен генерировать каждое новое число с примерно одинаковой вероятностью. Это называется равномерностью распределения. Если некоторые числа генерируются чаще, чем другие, то результат программы, использующей ГПСЧ, будет предсказуем! Например, предположим, вы пытаетесь написать генератор случайных предметов для игры. Вы выбираете случайное число от 1 до 10, и, если результатом будет 10, игрок получит крутой предмет вместо среднего. Шансы должны быть 1 к 10. Но, если ваш ГПСЧ неравномерно генерирует числа, например, десятки генерируются чаще, чем должны, то ваши игроки будут получать более редкие предметы чаще, чем предполагалось, и сложность, и интерес к такой игре автоматически уменьшаются.

Создать ГПСЧ, который бы генерировал равномерные результаты — сложно, и это одна из главных причин, по которым ГПСЧ, который мы написали в начале этого урока, не является очень хорошим.

Свойство №2:Метод, с помощью которого генерируется следующее число в последовательности, не должен быть очевиден или предсказуем. Например, рассмотрим следующий алгоритм ГПСЧ: num = num + 1. У него есть равномерность распределения рандомных чисел, но это не спасает его от примитивности и предсказуемости!

Свойство №3:ГПСЧ должен иметь хорошее диапазонное распределение чисел. Это означает, что маленькие, средние и большие числа должны возвращаться случайным образом. ГПСЧ, который возвращает все маленькие числа, а затем все большие — предсказуем и приведет к предсказуемым результатам.

Свойство №4:Период циклического повторения значений ГПСЧ должен быть максимально большим. Все ГПСЧ являются циклическими, т.е. в какой-то момент последовательность генерируемых чисел начнет повторяться. Как упоминалось ранее, ГПСЧ являются детерминированными, и с одним значением ввода мы получим одно и то же значение вывода. Подумайте, что произойдет, когда ГПСЧ сгенерирует число, которое уже ранее было сгенерировано. С этого момента начнется дублирование последовательности чисел между первым и последующим появлением этого числа. Длина этой последовательности называется периодом.

Например, вот представлены первые 100 чисел, сгенерированные ГПСЧ с плохой периодичностью:

112   9      130    97    64 31    152    119    86    53 20    141    108    75    42 9     130    97     64    31 152   119    86     53    20 141   108    75     42     9 130   97     64     31   152 119   86     53     20   141 108   75     42      9   130 97    64     31    152   119 86    53     20    141   108 75    42      9    130    97 64    31    152    119    86 53    20    141    108    75 42     9    130     97    64 31   152    119     86    53 20   141    108     75    42 9    130     97     64    31 152  119     86     53    20 141  108     75     42     9

Заметили, что он сгенерировал 9, как второе число, а затем как шестнадцатое? ГПСЧ застревает, генерируя последовательность между этими двумя 9-ми: 9-130-97-64-31-152-119-86-53-20-141-108-75-42- (повтор).

Хороший ГПСЧ должен иметь длинный период для всех стартовых чисел. Разработка алгоритма, соответствующего этому требованию, может быть чрезвычайно сложной — большинство ГПСЧ имеют длинные периоды для одних начальных чисел и короткие для других. Если пользователь выбрал начальное число, которое имеет короткий период, то и результаты будут соответствующие.

Генерация случайных чисел в заданном диапазоне

В большинстве случаев нам не нужны рандомные числа между и RAND_MAX — нам нужны числа между двумя другими значениями: min и max. Например, если нам нужно сымитировать бросок кубика, то диапазон значений будет невелик: от 1 до 6.

Вот небольшая функция, которая конвертирует результат функции rand() в нужный нам диапазон значений:

Чтобы сымитировать бросок кубика, вызываем функцию getRandomNumber(1, 6).

Функции srand() и rand()

Языки Cи и C++ имеют свои собственные встроенные генераторы случайных чисел. Они реализованы в 2-х отдельных функциях, которые находятся в заголовочном файле cstdlib:

   Функция srand() устанавливает передаваемое пользователем значение в качестве стартового. srand() следует вызывать только один раз — в начале программы (обычно в верхней части функции main()).

   Функция rand() генерирует следующее случайное число в последовательности. Оно будет находиться в диапазоне от до RAND_MAX (константа в cstdlib, значением которой является 32767).

Вот пример программы, в которой используются обе эти функции:

Результат выполнения программы:

14867   24680   8872    25432   21865 17285   18997   10570   16397   30572 22339   31508   1553    124     779 6687    23563   5754    25989   16527 19808   10702   13777   28696   8131 18671   27093   8979    4088    31260 31016   5073    19422   23885   18222 3631    19884   10857   30853   32618 31867   24505   14240   14389   13829 13469   11442   5385    9644    9341 11470   189     3262    9731    25676 1366    24567   25223   110     24352 24135   459     7236    17918   1238 24041   29900   24830   1094    13193 10334   6192    6968    8791    1351 14521   31249   4533    11189   7971 5118    19884   1747    23543   309 28713   24884   1678    22142   27238 6261    12836   5618    17062   13342 14638   7427    23077   25546   21229

Wikipedia

О «Википедии» слышал даже самый прожжённый двоечник, которому знания в принципе ни к чему. Что уж говорить о людях, желающих получить новую информацию. Google отдаёт дань уважения «Википедии», выводя ссылки на её страницы в отдельном блоке выдачи поискового запроса. Количество статей, размещённых в интернет-библиотеке, тяжело сосчитать, а тем более прочесть. Но это вовсе не говорит о том, что вы не должны постепенно расширять свой кругозор.

23075125-Wikipedia-520x349.png
Wiki знает всё

Внимательные читатели знают, что в левой боковой панели «Википедии» расположена специальная ссылка на случайную статью. За рандомный перевод на новую страницу также отвечает комбинация клавиш Alt + Shift + X.

Веб-сайт

Сеть полна чёрных и светлых закоулков. Куда вас закинет RamdomWebSite? Тяжело предположить. Веб-сервис генерирует случайную ссылку на веб-страницу абсолютно любой тематики и предназначения.

23075100-RamdomWebSite-520x349.png
Интересно, какое лицо будет у вас после открытия случайной ссылки

Авторы сервиса стараются исключать из выдачи страницы с порнографическим содержанием, хотя и не гарантируют 100% защиты от подобных ресурсов.

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий