Компьютерная программа случайным образом выбирает двузначные числа, если компьютер выбирает 255

Обновлено: 04.07.2024

Мы можем использовать перестановки и комбинации, чтобы ответить на более сложные вопросы вероятности.

примеры

Выбран 4-значный PIN-код. Какова вероятность того, что повторяющихся цифр нет?

Есть 10 возможных значений для каждой цифры PIN-кода (а именно: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9), поэтому 10 · 10 · 10 · 10 = 10 4 = 10 000 возможных PIN-кодов.

Чтобы не было повторяющихся цифр, все четыре цифры должны быть разными, что означает выбор без замены. Мы могли бы либо вычислить 10 · 9 · 8 · 7, либо заметить, что это то же самое, что и перестановка 10P4 = 5040.

Вероятность отсутствия повторяющихся цифр – это отношение количества четырехзначных PIN-кодов без повторяющихся цифр к общему количеству четырехзначных PIN-кодов. Эта вероятность равна [latex]\frac__>><<^>>=\frac=0,504[/latex]

Попробовать

Пример

В лотерее определенного штата 48 шаров с номерами от 1 до 48 помещаются в автомат, и шесть из них вытягиваются случайным образом. Если шесть выпавших номеров совпадают с номерами, выбранными игроком, игрок выигрывает 1 000 000 долларов. В этой лотерее порядок выпадения номеров не имеет значения. Вычислите вероятность того, что вы выиграете приз в миллион долларов, если купите один лотерейный билет.

Чтобы вычислить вероятность, нам нужно подсчитать общее количество способов, которыми можно вытянуть шесть чисел, и количество способов, которыми шесть чисел в билете игрока могут совпасть с шестью числами, выпавшими из автомата. Поскольку нет условия, чтобы числа были в каком-либо конкретном порядке, количество возможных исходов лотереи составляет 48C6 = 12 271 512. Из этих возможных исходов только один угадает все шесть чисел в билете игрока, поэтому вероятность выиграть главный приз равна:

Пример

В лотерее штата из предыдущего примера, если пять из шести выпавших номеров совпадают с номерами, выбранными игроком, игрок выигрывает второй приз в размере 1000 долларов США. Вычислите вероятность того, что вы выиграете второй приз, если купите один лотерейный билет.

Как и выше, количество возможных исходов лотереи равно 48C6 = 12 271 512. Чтобы выиграть второй приз, пять из шести номеров в билете должны совпадать с пятью из шести выигрышных номеров; другими словами, мы должны были выбрать пять из шести выигрышных номеров и один из 42 проигрышных номеров. Количество способов выбрать 5 из 6 выигрышных номеров определяется как 6C5 = 6, а количество способов выбрать 1 из 42 проигрышных номеров определяется как 42C. 1 = 42. Таким образом, количество благоприятных исходов определяется основным правилом подсчета: 6C5 · 42C1 = 6 · 42 = 252. . Таким образом, вероятность выиграть второй приз равна.

Предыдущие примеры показаны в следующем видео.

примеры

Вычислите вероятность случайного извлечения пяти карт из колоды и получения ровно одного туза.

Во многих карточных играх (например, в покере) порядок вытягивания карт не важен (поскольку игрок может переставлять карты в руке по своему усмотрению); в следующих задачах мы будем предполагать, что это так, если не оговорено противное. Таким образом, мы используем комбинации для вычисления возможного количества рук из 5 карт, 52C5. Это число войдет в знаменатель нашей формулы вероятности, так как это количество возможных исходов.

Для числителя нам нужно количество способов вытащить из колоды один туз и четыре другие карты (ни одна из них не является тузами). Поскольку есть четыре туза, и нам нужен ровно один из них, будет 4C1 способа выбрать один туз; поскольку есть 48 не-тузов, а нам нужны 4 из них, будет 48C4 способов выбрать четырех не-тузов. Теперь мы используем основное правило подсчета, чтобы вычислить, что будет 4C1 · 48C4 способов выбрать один туз и четыре не-туза.

Собрав все вместе, мы имеем

Пример

Вычислите вероятность случайного извлечения пяти карт из колоды и получения ровно двух тузов.

Решение аналогично предыдущему примеру, за исключением того, что теперь мы выбираем 2 туза из 4 и 3 не-туза из 48; знаменатель остается прежним:

Полезно отметить, что эти проблемы с картами очень похожи на проблемы с лотереей, которые обсуждались ранее.

Для дальнейшей демонстрации этих примеров просмотрите следующее.

Попробовать

Проблема дня рождения

Давайте сделаем паузу, чтобы рассмотреть известную проблему теории вероятностей:

Предположим, у вас есть комната, полная 30 человек. Какова вероятность того, что есть хотя бы один общий день рождения?

Угадайте ответ на приведенную выше задачу. Было ли ваше предположение довольно низким, около 10%? Это кажется интуитивным ответом (возможно, 30/365?). Давайте посмотрим, стоит ли нам прислушиваться к своей интуиции. Однако давайте начнем с более простой задачи.

пример

Предположим, в комнате находятся три человека. Какова вероятность того, что у этих трех человек есть хотя бы один общий день рождения?

Существует множество способов, как минимум один общий день рождения. К счастью, есть более простой способ. Мы спрашиваем себя: «Какова альтернатива хотя бы одному общему дню рождения?» В этом случае альтернативой является отсутствие общих дней рождения. Другими словами, альтернатива «по крайней мере одному» — не иметь ни одного. Другими словами, поскольку это дополнительное событие,

P(хотя бы один) = 1 – P(нет)

Тогда мы начнем с вычисления вероятности отсутствия общего дня рождения. Давайте представим, что вы один из этих трех человек. Ваш день рождения может быть каким угодно без конфликтов, поэтому для вашего дня рождения есть 365 вариантов из 365. Какова вероятность того, что второй человек не совпадает с вашим днем ​​рождения? В году 365 дней (давайте проигнорируем високосные годы), и если исключить ваш день рождения из разногласий, есть 364 варианта, которые гарантируют, что вы не делите день рождения с этим человеком, поэтому вероятность того, что второй человек не совпадает с вашим днем ​​​​рождения это 364/365. Теперь переходим к третьему лицу. Какова вероятность того, что у этого третьего человека не совпадает день рождения ни с вами, ни со вторым человеком? Существует 363 дня, в которые день рождения не будет совпадать ни с вашим днем ​​рождения, ни с днем ​​рождения второго человека, поэтому вероятность того, что у третьего человека день рождения не совпадает с днем ​​рождения первых двух, составляет 363/365.

Мы хотим, чтобы у второго человека не было общего дня рождения с вами, и у третьего человека не было общего дня рождения с первыми двумя людьми, поэтому мы используем правило умножения:

а затем вычесть из 1, чтобы получить

P(общий день рождения) = 1 – P(нет общего дня рождения) = 1 – 0,9918 = 0,0082.

Это довольно небольшое число, поэтому, возможно, имеет смысл, что ответ на нашу первоначальную задачу будет небольшим. Давайте немного расширим нашу группу.

Предположим, в комнате находятся пять человек. Какова вероятность того, что у этих пяти человек есть хотя бы один общий день рождения?

Продолжая шаблон предыдущего примера, ответ должен быть

Обратите внимание, что мы могли бы переписать это более компактно, как

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

Предположим, в комнате находится 30 человек. Какова вероятность того, что среди этих 30 человек есть хотя бы один общий день рождения?

Здесь мы можем вычислить

что дает нам неожиданный результат: когда вы находитесь в комнате с 30 людьми, вероятность того, что будет хотя бы один общий день рождения, составляет 70%!

Проблема дня рождения подробно рассматривается ниже.

Если вы хотите поспорить и сможете убедить 30 человек сообщить свои дни рождения, вы можете выиграть немного денег, поспорив с другом, что в любое время в комнате будут как минимум два человека с одинаковым днем ​​рождения. находятся в помещении на 30 и более человек. (Конечно, вам нужно убедиться, что ваш друг не изучал вероятность!) Вы не гарантированно выиграете, но вы должны выигрывать более чем в половине случаев.

Это один из многих противоречивых результатов теории вероятностей. то есть это идет вразрез с нашими инстинктами.

Попробовать

Предположим, что в комнате находятся 10 человек. Какова вероятность того, что среди этих 10 человек есть хотя бы один общий день рождения?

Случайные числа на компьютере не являются случайными. Они представляют собой последовательность «псевдо» случайных чисел.

Во-первых, на самом деле невозможно (да и нежелательно) иметь настоящие случайные числа. Нам нужна повторяющаяся последовательность кажущихся случайными чисел, удовлетворяющая определенным свойствам, таким как среднее значение списка случайных чисел от, скажем, от 0 до 1000, должно быть равно 500. Другие свойства, такие как отсутствие (предсказуемой) связи между текущее случайное число и желательно следующее случайное число.

В любой программе, где необходимы случайные значения (например, в большинстве симуляций), язык программирования должен предоставлять нам генератор случайных чисел. Это будет функция, которая при вызове предоставит нам одно случайное число. при повторном вызове предоставить нам другой случайный номер.

«Псевдо» случайные числовые последовательности

Сгенерировать одно случайное число очень просто. 27. Вот!

Сгенерировать последовательность случайных чисел довольно сложно, потому что мы хотим, чтобы определенные предположения об этой последовательности были верны!

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

  1. Повторяемость: почему?
  2. Скорость (быстрый расчет): почему?
  3. Среднее значение – это среднее значение диапазона.
  4. За нечетным следует четное, равно как и четное, за которым следует нечетное.
  5. Выбирая 1000 номеров от 0 до 1000, мы не попадем в каждое число.
  6. Выбирая числа от 0 до 1000, мы с равной вероятностью получим любое число.
  7. При выборе 10 000 чисел от 0 до 1000 мы, скорее всего, получим примерно по 10 каждого числа.

Некоторые возможные методы создания случайной последовательности:

  1. Время – используйте часы компьютера.
  2. Радиация. Установите в компьютер излучение и вычислите, как часто распадаются атомы. (угу)
  3. Математика — используйте формулу (см. ниже)

Преимущество использования математики для генерации случайных чисел (последовательности) заключается в том, что они ПОВТОРЯЕМЫ. Это важно по следующей причине: отладка программы. Представьте, какие проблемы у вас уже есть с поиском ошибок в коде. Что произойдет, если «путь» (или поток программы) каждый раз будет другим (случайным)? Отладка была бы кошмаром! В конце концов, программисту каждый раз нужна одна и та же последовательность случайных чисел, но пользователю может потребоваться другая последовательность. Чтобы сгенерировать другую последовательность случайных чисел, мы используем функцию «затравки». Для целей этого курса вам, скорее всего, не потребуется «задавать» генератор случайных чисел.

Специфические языковые функции.

В случае Matlab и C этим генератором является функция rand(). В случае с Java или Actionscript есть случайная функция, связанная с библиотекой Math.

Matlab: ранд

Функция rand в Matlab

Функция генерации случайных чисел в Matlab называется rand. В Matlab функция rand возвращает число с плавающей запятой от 0 до 1 (например, .01, .884, .123 и т. д.).

Чтобы создать логическое значение (true/false) для подбрасывания монеты! р

C: ранд

Функция rand в C

В C rand() возвращает значение от 0 до большого целого числа (вызывается по имени "RAND_MAX", найденному в stdlib.h).

Чтобы преобразовать формат C в формат Matlab, в C мы должны сказать: "rand() / (float)RAND_MAX".

Чтобы создать логическое значение (true/false) для подбрасывания монеты!

ActionScript: Math.random.

Случайная функция в ActionScript

Функция Math.random() генерирует значение больше или равное 0 и меньше 1,0.

Чтобы создать логическое значение (true/false) для подбрасывания монеты!

Чтобы создать число от 1 до 10, нужно сделать следующее:

Примеры

Ниже приведены примеры генерации значений с помощью генератора случайных чисел.

Для краткости в этих примечаниях используется функция rand, которая вычисляет случайное число от 0 до (меньше) 1. Если используемая вами функция не возвращает число от 0 до 1, вы сможете преобразовать свое число генератора в этот формат путем деления на большое целое число.

Дано случайное число от 0 до 1, относительно легко сгенерировать случайные числа или значения любого типа. Например:

Случайное число от 0 до 100

Случайное значение true или false

Случайное число от 50 до 100

Случайное целое число от 1 до 10

Чтобы получить целое число из значения с плавающей запятой, мы можем использовать такие функции, как round, ceil или floor. Функция round возвращает ближайшее целое число, ceil — следующее большее целое число, а floor — следующее меньшее целое число. Таким образом, потолок 1,001 равен 2, а потолок 1,999 также равен 2. Раунд 1,001 равен 1, а раунд 1,999 равен 2. Пол 1,999 равен 1 и т. д. Максимум 1,9 равен 2, как и потолок 1,1 или 1,0001. .

Генерация случайных чисел

Маловероятно, что вам когда-либо придется писать собственный генератор случайных чисел. Для большинства/всех языков, которые вы когда-либо будете использовать, уже есть один, написанный для вас. При этом есть некоторая ценность в знании возможных способов генерации чисел. Эта ценность заключается в том, чтобы знать, чего ожидать, когда вы получаете последовательность случайных чисел. Вы бы не хотели, чтобы ваши призраки Pac-Man всегда смещались в правый верхний угол экрана, что могло случиться, если бы случайные числа, которые они использовали для перемещения, были не такими уж случайными.

Следующая идея представляет собой простой, быстрый и эффективный генератор случайных чисел, но очень чувствительный к выбору констант:

next_number = (previous_number * Constant1) Mod Constant2

Нам действительно не нужны переменные next и previous, поэтому мы можем сказать:

число = (число * Константа1) Mod Константа2

Константа2 обычно выбирается в качестве простого числа. Почему? (думаю, next_number = 0)

Проблема: переполнение!

Решение: больше математики!

Идея приведенного выше кода состоит в том, чтобы избежать переполнения путем перестановки уравнения таким образом, чтобы никакая часть не могла быть больше M.

Некоторая информация относится к предварительной версии продукта, которая может быть существенно изменена до ее выпуска. Microsoft не дает никаких явных или подразумеваемых гарантий в отношении представленной здесь информации.

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

Примеры

В следующем примере создается один генератор случайных чисел и вызываются его методы NextBytes, Next и NextDouble для создания последовательностей случайных чисел в разных диапазонах.

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

Примечания

Псевдослучайные числа выбираются с равной вероятностью из конечного набора чисел. Выбранные числа не являются полностью случайными, поскольку для их выбора используется математический алгоритм, но они достаточно случайны для практических целей. Текущая реализация класса Random основана на модифицированной версии алгоритма вычитания случайных чисел Дональда Кнута. Для получения дополнительной информации см. D. E. Knuth. Искусство программирования, том 2: получисловые алгоритмы. Эддисон-Уэсли, Рединг, Массачусетс, третье издание, 1997 г.

Чтобы сгенерировать криптографически безопасное случайное число, например такое, которое подходит для создания случайного пароля, используйте класс RNGCryptoServiceProvider или производный класс от System.Security.Cryptography.RandomNumberGenerator.

Создание генератора случайных чисел

Вы создаете экземпляр генератора случайных чисел, предоставляя начальное значение (начальное значение для алгоритма генерации псевдослучайных чисел) конструктору класса Random. Вы можете указать начальное значение явно или неявно:

Конструктор Random(Int32) использует заданное вами явное начальное значение.

Конструктор Random() использует начальное значение по умолчанию. Это наиболее распространенный способ запуска генератора случайных чисел.

Избегайте множественных экземпляров

Чтобы повысить производительность и избежать непреднамеренного создания отдельных генераторов случайных чисел, которые генерируют идентичные числовые последовательности, мы рекомендуем вам создать один объект Random для генерации множества случайных чисел с течением времени, а не создавать новые объекты Random для генерации одного случайного числа.

Однако класс Random не является потокобезопасным. Если вы вызываете методы Random из нескольких потоков, следуйте рекомендациям, описанным в следующем разделе.

Класс System.Random и безопасность потоков

Вместо создания экземпляров отдельных объектов Random мы рекомендуем создать один экземпляр Random для генерации всех случайных чисел, необходимых вашему приложению. Однако объекты Random не являются потокобезопасными. Если ваше приложение вызывает методы Random из нескольких потоков, вы должны использовать объект синхронизации, чтобы гарантировать, что только один поток может получить доступ к генератору случайных чисел за раз. Если вы не гарантируете, что доступ к объекту Random осуществляется потокобезопасным способом, вызовы методов, возвращающих случайные числа, возвращают 0.

Пример обеспечивает безопасность потоков следующими способами:

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

Семафор (объект CountdownEvent) используется для обеспечения блокировки основного потока до тех пор, пока все остальные потоки не завершат выполнение.

В этом примере проверяется, не поврежден ли генератор случайных чисел, путем определения того, возвращают ли два последовательных вызова методов генерации случайных чисел 0. Если повреждение обнаружено, в примере используется объект CancellationTokenSource, чтобы сигнализировать о том, что все потоки должны быть отменены.

Перед созданием каждого случайного числа каждый поток проверяет состояние объекта CancellationToken. Если запрашивается отмена, в примере вызывается метод CancellationToken.ThrowIfCancellationRequested для отмены потока.

Следующий пример идентичен первому, за исключением того, что в нем используется объект Task и лямбда-выражение вместо объектов Thread.

Он отличается от первого примера следующим образом:

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

Статический метод Task.WaitAll используется, чтобы гарантировать, что основной поток не завершится до завершения всех задач. Нет необходимости в объекте CountdownEvent.

Исключение, возникающее в результате отмены задачи, проявляется в методе Task.WaitAll. В предыдущем примере это обрабатывается каждым потоком.

Создание различных типов случайных чисел

Генератор случайных чисел предоставляет методы, позволяющие генерировать следующие типы случайных чисел:

Серия значений байтов.Вы определяете количество байтовых значений, передавая массив, инициализированный числом элементов, которые вы хотите, чтобы метод возвращал методу NextBytes. В следующем примере создается 20 байт.

Одно целое число. Вы можете выбрать, хотите ли вы целое число от 0 до максимального значения (Int32.MaxValue - 1), вызвав метод Next(), целое число от 0 до определенного значения, вызвав метод Next(Int32), или целое число в пределах диапазон значений, вызвав метод Next(Int32, Int32). В параметризованных перегрузках указанное максимальное значение является исключительным; то есть фактическое максимальное сгенерированное число на единицу меньше указанного значения.

В следующем примере вызывается метод Next(Int32, Int32) для создания 10 случайных чисел в диапазоне от -10 до 10. Обратите внимание, что второй аргумент метода указывает исключительную верхнюю границу диапазона случайных значений, возвращаемых методом. Другими словами, наибольшее целое число, которое может вернуть метод, на единицу меньше этого значения.

Одно значение с плавающей запятой от 0,0 до менее 1,0 путем вызова метода NextDouble. Исключающая верхняя граница случайного числа, возвращаемого методом, равна 1, поэтому его фактическая верхняя граница равна 0,99999999999999978. В следующем примере создается 10 случайных чисел с плавающей запятой.

Метод Next(Int32, Int32) позволяет указать диапазон возвращаемого случайного числа. Однако параметр maxValue, указывающий возвращаемое число верхнего диапазона, является исключающим, а не включающим значением. Это означает, что вызов метода Next(0, 100) возвращает значение от 0 до 99, а не от 0 до 100.

Подстановка собственного алгоритма

Вы можете реализовать свой собственный генератор случайных чисел, унаследовав его от класса Random и предоставив свой алгоритм генерации случайных чисел. Чтобы указать свой собственный алгоритм, вы должны переопределить метод Sample, который реализует алгоритм генерации случайных чисел. Вы также должны переопределить методы Next(), Next(Int32, Int32) и NextBytes, чтобы убедиться, что они вызывают ваш переопределенный метод Sample. Вам не нужно переопределять методы Next(Int32) и NextDouble.

Пример, производный от класса Random и модифицирующий генератор псевдослучайных чисел по умолчанию, см. на странице справки по примерам.

Как вы используете System.Random для.

В следующих разделах обсуждаются и приводятся примеры кода для некоторых способов использования случайных чисел в приложении.

Получить ту же последовательность случайных значений

Иногда вам нужно сгенерировать одну и ту же последовательность случайных чисел в сценариях тестирования программного обеспечения и в играх. Тестирование с той же последовательностью случайных чисел позволяет обнаруживать регрессии и подтверждать исправления ошибок. Использование той же последовательности случайных чисел в играх позволяет переиграть предыдущие игры.

Получить уникальные последовательности случайных чисел

Предоставление различных начальных значений экземплярам класса Random приводит к тому, что каждый генератор случайных чисел создает разные последовательности значений. Вы можете предоставить начальное значение либо явно, вызвав конструктор Random(Int32), либо неявно, вызвав конструктор Random(). Большинство разработчиков вызывают конструктор без параметров, который использует системные часы. В следующем примере этот подход используется для создания двух экземпляров Random. Каждый экземпляр отображает серию из 10 случайных целых чисел.

Чтобы этого не произошло, мы рекомендуем создавать экземпляр одного случайного объекта, а не нескольких. Однако, поскольку Random не является потокобезопасным, вы должны использовать какое-либо устройство синхронизации, если вы получаете доступ к экземпляру Random из нескольких потоков; Дополнительные сведения см. в разделе Класс Random и безопасность потоков ранее в этом разделе. Кроме того, вы можете использовать механизм задержки, такой как метод Sleep, использованный в предыдущем примере, чтобы гарантировать, что экземпляры происходят с интервалом более 15 миллисекунд.

Получить целые числа в указанном диапазоне

Вы можете получить целые числа в указанном диапазоне, вызвав метод Next(Int32, Int32), который позволяет указать как нижнюю, так и верхнюю границу чисел, которые должен возвращать генератор случайных чисел. Верхняя граница является исключающим, а не включающим значением. То есть он не входит в диапазон значений, возвращаемых методом. В следующем примере этот метод используется для генерации случайных целых чисел от -10 до 10. Обратите внимание, что он указывает 11, что на единицу больше желаемого значения, в качестве значения аргумента maxValue в вызове метода.

Получить целые числа с указанным количеством цифр

Можно вызвать метод Next(Int32, Int32) для получения чисел с указанным количеством цифр. Например, чтобы получить числа с четырьмя цифрами (то есть числа в диапазоне от 1000 до 9999), вы вызываете метод Next(Int32, Int32) со значением minValue, равным 1000, и значением maxValue, равным 10000, как показано в следующем примере. .

Получить значения с плавающей запятой в указанном диапазоне

Метод NextDouble возвращает случайные значения с плавающей запятой в диапазоне от 0 до менее 1. Однако часто требуется генерировать случайные значения в другом диапазоне.

Если интервал между минимальным и максимальным желаемыми значениями равен 1, вы можете добавить разницу между желаемым начальным интервалом и 0 к числу, возвращаемому методом NextDouble. В следующем примере это делается для генерации 10 случайных чисел в диапазоне от -1 до 0.

Чтобы сгенерировать случайные числа с плавающей запятой, нижняя граница которых равна 0, а верхняя граница больше 1 (или, в случае отрицательных чисел, нижняя граница которых меньше -1, а верхняя граница равна 0), умножьте случайное число по ненулевой границе. В следующем примере это делается для создания 20 миллионов случайных чисел с плавающей запятой в диапазоне от 0 до Int64.MaxValue. В также отображается распределение случайных значений, сгенерированных методом.

Чтобы сгенерировать случайные числа с плавающей запятой между двумя произвольными значениями, как это делает метод Next(Int32, Int32) для целых чисел, используйте следующую формулу:

В следующем примере создается 1 миллион случайных чисел в диапазоне от 10,0 до 11,0 и отображается их распределение.

Создание случайных логических значений

Класс Random не предоставляет методов, генерирующих логические значения. Однако для этого вы можете определить свой собственный класс или метод. В следующем примере определяется класс BooleanGenerator с одним методом NextBoolean . Класс BooleanGenerator хранит объект Random как закрытую переменную. Метод NextBoolean вызывает метод Random.Next(Int32, Int32) и передает результат методу Convert.ToBoolean(Int32). Обратите внимание, что 2 используется в качестве аргумента для указания верхней границы случайного числа. Поскольку это исключительное значение, вызов метода возвращает либо 0, либо 1.

Вместо создания отдельного класса для генерации случайных логических значений в примере можно было бы просто определить один метод. Однако в этом случае объект Random должен был быть определен как переменная уровня класса, чтобы избежать создания нового экземпляра Random при каждом вызове метода. В Visual Basic экземпляр Random можно определить как статическую переменную в методе NextBoolean. В следующем примере представлена ​​реализация.

Создание случайных 64-битных целых чисел

Перегрузки метода Next возвращают 32-разрядные целые числа. Однако в некоторых случаях вам может понадобиться работать с 64-битными целыми числами. Вы можете сделать это следующим образом:

Вызовите метод NextDouble, чтобы получить значение с плавающей запятой двойной точности.

Умножьте это значение на Int64.MaxValue.

В следующем примере этот метод используется для создания 20 миллионов случайных длинных целых чисел и распределения их по 10 равным группам. Затем он оценивает распределение случайных чисел, подсчитывая число в каждой группе от 0 до Int64.MaxValue. Как видно из выходных данных примера, числа распределены более или менее равномерно по всему диапазону длинного целого числа.

Альтернативный метод, использующий манипуляции с битами, не генерирует действительно случайные числа. Этот метод вызывает Next() для генерации двух целых чисел, сдвигает одно из них влево на 32 бита и объединяет их вместе. Этот метод имеет два ограничения:

Поскольку бит 31 является битом знака, значение в бите 31 результирующего длинного целого числа всегда равно 0. Это можно решить, сгенерировав случайный 0 или 1, сдвинув его влево на 31 бит и объединив его с исходным ИЛИ. случайное длинное целое.

Более серьезно, поскольку вероятность того, что значение, возвращаемое функцией Next(), будет равно 0, случайных чисел в диапазоне 0x0–0x00000000FFFFFFFF будет мало, если они вообще будут.

Получить байты в указанном диапазоне

Перегрузки метода Next позволяют указывать диапазон случайных чисел, а метод NextBytes — нет. В следующем примере реализуется метод NextBytes, позволяющий указать диапазон возвращаемых байтов. Он определяет класс Random2, производный от Random, и перегружает его метод NextBytes.

Выбрать элемент из массива или коллекции случайным образом

Случайные числа часто служат индексами для извлечения значений из массивов или коллекций. Чтобы получить случайное значение индекса, вы можете вызвать метод Next(Int32, Int32) и использовать нижнюю границу массива в качестве значения его аргумента minValue и значение, превышающее верхнюю границу массива, в качестве значения его maxValue. аргумент. Для массива с отсчетом от нуля это эквивалентно его свойству Length или на единицу больше, чем значение, возвращаемое методом Array.GetUpperBound. В следующем примере из массива городов случайным образом извлекается название города в США.

Получить уникальный элемент из массива или коллекции

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

Существует ряд способов справиться с этим сценарием. Одним из распространенных решений является создание массива или коллекции, содержащей извлекаемые значения, и параллельного массива, содержащего случайные числа с плавающей запятой. Второй массив заполняется случайными числами во время создания первого массива, а метод Array.Sort(Array, Array) используется для сортировки первого массива с использованием значений в параллельном массиве.

Например, если вы разрабатываете пасьянс, вы хотите, чтобы каждая карта использовалась только один раз. Вместо того, чтобы генерировать случайные числа для получения карты и отслеживать, была ли эта карта уже сдана, вы можете создать параллельный массив случайных чисел, который можно использовать для сортировки колоды. После сортировки колоды ваше приложение может поддерживать указатель, указывающий индекс следующей карты в колоде.

Следующий пример иллюстрирует этот подход. Он определяет класс Card, представляющий игральную карту, и класс Dealer, который сдает колоду перетасованных карт. Конструктор класса Dealer заполняет два массива: массив колоды, имеющий область класса и представляющий все карты в колоде; и массив локального порядка, который имеет то же количество элементов, что и массив колоды, и заполняется случайно сгенерированными значениями Double. Затем вызывается метод Array.Sort(Array, Array) для сортировки массива колод на основе значений в массиве порядка.

Примечания для наследников

Примечания для звонящих

Конструкторы

Инициализирует новый экземпляр класса Random, используя начальное значение по умолчанию.

Инициализирует новый экземпляр класса Random, используя указанное начальное значение.

Свойства

Предоставляет потокобезопасный экземпляр Random, который можно использовать одновременно из любого потока.

Методы

Определяет, равен ли указанный объект текущему объекту.

Служит хеш-функцией по умолчанию.

Получает тип текущего экземпляра.

Создает поверхностную копию текущего объекта.

Возвращает неотрицательное случайное целое число.

Возвращает неотрицательное случайное целое число, которое меньше указанного максимума.

Возвращает случайное целое число, находящееся в указанном диапазоне.

Заполняет элементы указанного массива байтов случайными числами.

Заполняет элементы указанного диапазона байтов случайными числами.

Возвращает случайное число с плавающей запятой, которое больше или равно 0,0 и меньше 1,0.

Возвращает неотрицательное случайное целое число.

Возвращает неотрицательное случайное целое число, которое меньше указанного максимума.

Возвращает случайное целое число, находящееся в указанном диапазоне.

Возвращает случайное число с плавающей запятой, которое больше или равно 0,0 и меньше 1,0.

MATLAB ® использует алгоритмы для генерации псевдослучайных и псевдонезависимых чисел. Эти числа не являются строго случайными и независимыми в математическом смысле, но они проходят различные статистические тесты на случайность и независимость, и их расчет можно повторять в целях тестирования или диагностики.

Функции rand , randi , randn и randperm являются основными функциями для создания массивов случайных чисел. Функция rng позволяет управлять начальным числом и алгоритмом, генерирующим случайные числа.

Функции случайных чисел

Существует четыре основных функции случайных чисел: rand , randi , randn и randperm . Функция rand возвращает числа с плавающей запятой от 0 до 1, взятые из равномерного распределения. Например:

r1 — это вектор-столбец размером 1 000 на 1, содержащий действительные числа с плавающей запятой, взятые из равномерного распределения. Все значения в r1 находятся в открытом интервале (0, 1). Гистограмма этих значений примерно плоская, что указывает на довольно равномерную выборку чисел.

Функция randi возвращает двойные целые значения, взятые из дискретного равномерного распределения. Например,

r2 — это вектор-столбец размером 1000 на 1, содержащий целые значения, взятые из дискретного равномерного распределения, диапазон которого находится в близком интервале [1, 10]. Гистограмма этих значений примерно плоская, что указывает на довольно равномерную выборку целых чисел от 1 до 10.

Функция randn возвращает массивы действительных чисел с плавающей запятой, полученные из стандартного нормального распределения. Например:

r3 – это вектор-столбец размером 1 000 на 1, содержащий числа, взятые из стандартного нормального распределения. Гистограмма r3 выглядит примерно как нормальное распределение со средним значением 0 и стандартным отклонением 1.

Вы можете использовать функцию randperm для создания двойного массива случайных целочисленных значений, не имеющих повторяющихся значений. Например,

r4 — это массив 1 на 5, содержащий целые числа, случайно выбранные из диапазона [1, 15].В отличие от randi , который может возвращать массив, содержащий повторяющиеся значения, массив, возвращаемый randperm, не имеет повторяющихся значений.

Последовательные вызовы любой из этих функций возвращают разные результаты. Такое поведение полезно для создания нескольких разных массивов случайных значений.

Генераторы случайных чисел

MATLAB предлагает несколько вариантов алгоритма генератора, которые перечислены в таблице.

< td>Быстрый вихрь Мерсенна, ориентированный на SIMD
ЗначениеИмя генератораКлючевое слово генератора
' Twister' Mersenne Twister (используется потоком по умолчанию при запуске MATLAB)mt19937ar
'simdTwister'dsfmt19937
'combRecursive' Комбинированный множественный рекурсивный mrg32k3a
'multFibonacci' Мультипликативный лаговый Фибоначчиmlfg6331_64
'philox' Генератор Philox 4x32 с 10 патронамиphilox4x32_10
'threefry' Threefry 4x64 генератор на 20 цикловthreefry4x64_20
'v4' Устаревший генератор MATLAB версии 4.0mcg16807< /td>
'v5uniform' Устаревший универсальный генератор MATLAB версии 5.0swb2712
'v5normal' Устаревший генератор нормалей MATLAB версии 5.0shr3cong

Используйте функцию rng, чтобы установить начальное число и генератор, используемые функциями rand , randi , randn и randperm . Например, rng(0,'twister') сбрасывает генератор в состояние по умолчанию. Чтобы избежать повторения массивов случайных чисел при перезапуске MATLAB, см. раздел Почему случайные числа повторяются после запуска?

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

Типы данных со случайными числами

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

Читайте также: