Random создаёт не истинно случайные, а псевдослучайные последовательности. Генератор является детерминированным объектом с внутренним состоянием: начальное зерно и каждый последующий вызов определяют дальнейшее состояние и результат. Поэтому одинаковое зерно воспроизводит последовательность только при одинаковой реализации генератора и полностью одинаковом порядке обращений к нему.
Контракт генератора состоит не только из значений, но и из распределения. Next(maxValue) выбирает целое из полуинтервала [0, maxValue), Next(minValue, maxValue) — из [minValue, maxValue), а NextDouble() возвращает значение из [0, 1). Равномерный выбор индекса, событие с вероятностью p, перемешивание и взвешенный выбор являются отдельными алгоритмами, корректность которых выводится из размеров соответствующих областей исходов.
Случайная программа проверяется двумя различными способами. Структурные свойства — допустимые границы, отсутствие повторов, сохранение перестановки и воспроизводимость — проверяются детерминированно. Вероятностные свойства исследуются сериями испытаний, частотами, средними и разбросом и никогда не подтверждаются одним удачным прогоном. Статистическое совпадение не заменяет доказательство алгоритма, а отклонение на конечной выборке само по себе не доказывает дефект генератора.
Опора — Раздел 22: псевдослучайные последовательности. Дополнительно используются числовая модель и приближённое сравнение из Раздела 7, циклы, инварианты и классы роста из Раздела 12, методы и явные контракты из Раздела 13, массивы, гистограммы, сортировка и бинарный поиск из Раздела 15, ссылочная семантика из Раздела 16, многомерные массивы из Раздела 17, строки из Раздела 19, структуры для результатов эксперимента из Раздела 20 и протокол серий из Раздела 21.
Каждая задача оформляется отдельной консольной программой полным шаблоном курса и компилируется с
<Nullable>enable</Nullable>. Разрешены только конструкции Разделов 1–22. Во всех проверяемых опытах используется явно заданный и выведенныйint seed; версия.NETтакже фиксируется. Один экземплярRandomсоздаётся на одну логическую последовательность и передаётся вычисляющим методам параметром. Создание генератора внутри метода,Random.Shared, скрытое получение зерна из времени, коллекции,LINQ, многопоточность, криптографические генераторы и обработка исключений запрещены, если задача прямо не исследует ошибочную схему. Точные значения последовательности не закрепляются как межплатформенный эталон: воспроизводимость требует одной реализации, версии среды и последовательности вызовов.Randomне применяется для паролей, токенов, ключей и других задач безопасности. Вероятностная проверка всегда сопровождается детерминированной проверкой границ и инвариантов.
База практических заданий
Уровень I. Базовый
Источник, зерно, распределение, число обращений и алгоритм преобразования заданы условием. Требуется точно воспроизвести готовую схему, проверить каждое значение по границам, подтвердить инвариант результата и повторить прогон с тем же зерном. Ученик не проектирует распределение или эксперимент: сложность возрастает от отдельных вызовов и состояния генератора к заполнению структур, гистограммам, подмножествам, равномерному тасованию и отделению случайного слоя от детерминированного ядра.
1. Паспорт Random: Создать генератор с явным зерном и получить серии значений через:
rng.Next()
rng.Next(10)
rng.Next(-5, 6)
rng.NextDouble()
Для каждого вызова проверить соответствующий контракт:
Вывести минимум и максимум каждой фактически полученной серии, не подменяя ими гарантированные границы API. Объяснить полуоткрытость и связь [0, n) с допустимыми индексами массива.
2. Зерно, состояние и сдвиг фазы: Создать два генератора с одинаковым зерном. Выполнить у них одинаковую последовательность из вызовов разных форм и подтвердить поэлементное совпадение. Затем создать новую пару с тем же зерном, но у первого генератора заранее отбросить один результат Next(). Показать сдвиг дальнейшей последовательности. Сформулировать условие воспроизводимости: одинаковы зерно, реализация и полный порядок вызовов.
3. Ловушка повторного создания: Сравнить:
- заполнение массива одним
Random(seed); - создание нового
Random(seed)перед каждым элементом.
Во втором случае каждый элемент получает один и тот же первый результат последовательности. Затем создать несколько генераторов с различными явно заданными зёрнами и показать, что различие зёрен не является доказательством отсутствия совпадений отдельных значений. Итоговое правило: генератор хранит состояние и не пересоздаётся для получения очередного элемента.
4. Явный источник случайности: Реализовать:
static int RollDie(Random rng)
static int SumOfRolls(
Random rng,
int count)
Внутри методов запрещено создавать Random. Один генератор создаётся в Main и передаётся во всю цепочку вызовов. Показать, что параметр получает копию ссылки на тот же объект и каждый вызов продвигает общее состояние. Повторить всю цепочку с новым генератором того же зерна и подтвердить идентичный результат.
5. Целые полуинтервалы и включительная граница: Реализовать:
static int NextInclusive(
Random rng,
int minimum,
int maximum)
Предусловие:
Метод вызывает:
rng.Next(minimum, maximum + 1)
Проверить вырожденный отрезок [a, a], отрицательные границы и обычный диапазон. Построить гистограммы для правильного варианта и ошибочного rng.Next(minimum, maximum), где верхнее значение отсутствует. Объяснить, почему контракт требует отдельного ограничения при maximum == int.MaxValue.
6. NextDouble, масштабирование и событие: Реализовать:
static double NextDoubleInRange(
Random rng,
double minimum,
double maximum)
static bool Bernoulli(
Random rng,
double probability)
Для первого метода математическая схема:
Предусловия: конечные minimum < maximum, конечная разность. Из-за округления двоичной арифметики строгое утверждение о недостижимости maximum после масштабирования не делается; каждый результат проверяется на принадлежность допустимому числовому контракту задачи. Второй метод использует rng.NextDouble() < probability при 0 <= probability <= 1. При 0 событие невозможно, при 1 наступает всегда.
7. Равномерный выбор элемента и координаты: Реализовать:
static bool TryChoose(
Random rng,
int[] data,
out int value,
out int index)
static bool TryChooseCell(
Random rng,
int[,] data,
out int row,
out int column)
Пустой массив или таблица с нулевым измерением дают false. Иначе индекс выбирается через Next(Length), а координаты — независимыми вызовами по соответствующим измерениям. Проверить допустимость каждой позиции и соответствие возвращённого значения выбранному индексу.
8. Воспроизводимое заполнение структур: Реализовать методы заполнения int[] и int[,] значениями из заданного полуинтервала. Два независимых результата, построенных от одинакового зерна и одинаковой последовательности вызовов, должны совпасть поэлементно. Изменение формы таблицы либо порядка вложенных циклов меняет число и порядок обращений и поэтому изменяет распределение значений по координатам, даже если общая последовательность генератора та же.
9. Гистограмма равномерного выбора: Выполнить trials вызовов rng.Next(categoryCount) и построить int[] counts. Проверить:
Для каждой категории вычислить частоту, абсолютное отклонение от 1.0 / categoryCount и наибольшее отклонение. Никакая отдельная категория не обязана получить точное ожидаемое количество; критерий задачи — корректный подсчёт и наблюдение изменения отклонений при росте числа испытаний.
10. Независимое случайное подмножество: Для каждого элемента входного массива независимо выполнить событие с вероятностью p. Результат сохраняет исходный порядок, но имеет случайную длину. Поскольку коллекции запрещены, сначала подсчитать включённые позиции в bool[] selected, затем создать массив точного размера и заполнить его вторым проходом. Проверить, что каждый элемент результата взят из соответствующей отмеченной позиции и не появляется дважды.
11. Тасование Фишера—Йейтса: Реализовать перемешивание массива на месте:
for (int i = data.Length - 1; i > 0; i--)
{
int j = rng.Next(i + 1);
// обмен data[i] и data[j]
}
До перемешивания сохранить копию. После подтвердить:
- длина не изменилась;
- мультимножество элементов сохранено;
- одинаковые зерно и вход дают одинаковую перестановку.
Инвариант: после окончания шага i суффикс (i, Length) уже занимает окончательные случайные позиции, а префикс [0, i] содержит все ещё не размещённые элементы.
12. Запись случайного входа и детерминированное воспроизведение: Разделить случайное блуждание на два метода:
static int[] GenerateSteps(
Random rng,
int count)
static int Walk(int[] steps)
GenerateSteps возвращает только -1 и +1; Walk не использует Random и вычисляет конечную позицию. Сначала повторить опыт по одному зерну, затем сохранить массив шагов и воспроизвести результат вообще без генератора. Объяснить различие между повтором по зерну и повтором по фактически сохранённым случайным данным.
Уровень II. Продвинутый
Условие задаёт вероятностную модель или исследовательский вопрос, но не готовое число серий, набор статистик, представление исходов и способ сопоставления с теорией. Требуется самостоятельно спроектировать опыт, вывести аналитическую вероятность или ожидание, обеспечить одинаковые условия повторов и отделить статистическое отклонение от нарушения алгоритма. В отличие от Уровня I ученик проектирует эксперимент, а не только реализует заданное отображение случайного числа.
1. Сходимость частот кости: Для trials = 10^2, 10^4, 10^6 провести серии бросков шестигранной кости. Для каждого размера вывести:
- шесть частот;
- максимальное абсолютное отклонение от
1/6; - среднеквадратичное отклонение частот;
- размах частот.
Использовать одно фиксированное зерно на отдельный полный прогон и не продолжать один генератор между независимыми сравнительными прогонами. Сделать только качественный вывод: при росте выборки типичный масштаб отклонений уменьшается, но не обязан убывать монотонно на каждом зерне.
2. Разброс оценки вероятности: Для события Бернулли с вероятностью p выполнить seriesCount независимых серий по trials испытаний. Каждая серия создаётся отдельным заранее заданным зерном. Получить массив оценок частоты и вычислить среднее и стандартное отклонение:
Сравнить с теоретическим масштабом:
Повторить для 100 * trials и проверить приблизительное десятикратное уменьшение разброса.
3. Сумма двух костей: Сначала тройным? Нет, двойным циклом перебрать все 36 упорядоченных пар граней и получить точное число исходов для сумм от 2 до 12. Затем провести случайную серию и сравнить частоты с:
Объяснить, почему равномерность каждой кости не означает равномерность суммы и почему равновероятными элементарными исходами являются упорядоченные пары.
4. Биномиальное распределение: Один опыт состоит из 10 независимых честных бросков монеты; результат — число успехов. Вычислить коэффициенты:
без факториалов большого размера и получить точные вероятности:
Затем построить эмпирическую гистограмму по множеству опытов. Проверить симметрию теоретического распределения и близость среднего результата к 5.
5. Число попыток до первого успеха: Для вероятности 0 < p <= 1 повторять испытания до первого успеха. Каждый опыт имеет страховочный maxAttempts; достижение потолка учитывается отдельно и не подменяется обычным успехом. По множеству опытов оценить среднее число попыток и сравнить с:
Если хотя бы один опыт достиг потолка, результат считается цензурированным и не выдаётся за несмещённую оценку 1 / p: потолок увеличивается либо ограничение явно включается в вывод. Проверить несколько p и объяснить, почему почти достоверная завершимость не является детерминированной верхней границей числа итераций.
6. Совпадение дней рождения: Для группы из groupSize <= 365 аналитически вычислить вероятность отсутствия совпадений:
а вероятность хотя бы одного совпадения — как дополнение. В симуляции дни выбираются из [0, 365), а повторы обнаруживаются через bool[365]. Найти наименьший размер группы, при котором аналитическая вероятность совпадения превышает 0.5, и подтвердить результат сериями.
7. Взвешенный выбор: Даны int[] weights с неотрицательными весами. Спроектировать:
static bool TryChooseWeighted(
Random rng,
int[] weights,
out int index)
Требования:
- хотя бы один вес положителен;
- сумма проверяется в
long; - сумма должна быть не больше
int.MaxValue; - бросок выполняется через
rng.Next(totalWeight); - выбран первый накопленный интервал, правая граница которого больше броска.
Доказать:
Нулевой вес никогда не выбирается.
8. Выбор ровно k элементов без повторов: Для 0 <= k <= n реализовать частичное тасование независимой копии:
for (int i = 0; i < k; i++)
{
int j = rng.Next(i, n);
// обмен copy[i] и copy[j]
}
Первые k элементов образуют упорядоченную выборку без повторов. Доказать, что каждая упорядоченная выборка достигается одинаковым числом цепочек, а значит каждый неупорядоченный набор размера k также равновероятен. Исходный массив сохраняется.
9. Моменты случайного блуждания: Выполнить множество независимых блужданий из stepCount шагов ±1. Вычислить:
- среднюю конечную позицию;
- средний квадрат позиции;
- дисперсию;
- средний модуль позиции.
Сравнить с теоретическими свойствами:
Повторить для нескольких размеров и проверить рост типичного модуля порядка .
10. Оценка площади методом Монте-Карло: Генерировать точки (x, y) в единичном квадрате и считать попадания в четверть единичного круга:
Оценка:
Для каждого размера выполнить несколько независимых серий, вывести среднее, размах и ошибку относительно Math.PI. Объяснить происхождение формулы из отношения площадей и то, почему увеличение числа точек не гарантирует монотонное улучшение каждого отдельного прогона.
11. Неподвижные точки случайной перестановки: Перемешать массив 0,1,\ldots,n-1 алгоритмом Фишера—Йейтса и подсчитать позиции i, где data[i] == i. По множеству перестановок оценить среднее число неподвижных точек. Аналитически через индикаторы получить:
Объяснить, почему линейность ожидания не требует независимости событий.
12. Сравнение стратегий на общих случайных данных: Один сценарий — заранее сгенерированный массив из 21 положительного значения из [1, 10]; такой длины достаточно для достижения обоих порогов даже при последовательности единиц. Стратегия с порогом t складывает значения до достижения не менее t; сумма выше 21 даёт результат 0, иначе результат равен сумме. Сравнить пороги 17 и 19:
- на общих массивах сценариев;
- на независимых случайных массивах для каждой стратегии.
Для каждой схемы вычислить среднюю разность результатов и стандартное отклонение разностей. Объяснить, почему общие случайные данные отделяют различие стратегий от части случайного шума и почему обе стратегии не должны обращаться к одному Random в разном порядке внутри сравниваемого вызова.
Уровень III. Экспертный
Исследуется не отдельная вероятность, а доказательство равномерности, источник статистического смещения или предел воспроизводимого вывода. До запуска требуется перечислить пространство исходов, вывести точное распределение либо оценку ошибки и сформулировать свойства, которые частотный эксперимент способен и не способен проверить. После запуска эмпирические данные сопоставляются с доказанной моделью, но не используются вместо неё.
1. Что именно воспроизводит зерно: Провести один составной эксперимент, включающий выбор, тасование и остановку по случайному событию. Сохранить:
- зерно;
- версию
.NET; - порядок вызовов;
- все непосредственно сгенерированные примитивные значения.
Показать три режима воспроизведения:
- то же зерно и тот же код в текущей среде;
- то же зерно после добавления одного лишнего вызова;
- повтор по сохранённому массиву случайных значений без
Random.
Сформулировать границу: зерно воспроизводит состояние конкретной реализации и трассы вызовов, а сохранённые случайные данные воспроизводят сам вход алгоритма независимо от будущего поведения генератора.
2. Смещение операции % и отбраковка: Рассмотреть идеальный равномерный источник цифр 0..9, реализованный как rng.Next(10). Отображение:
digit % 4
даёт точные вероятности:
Реализовать равномерную альтернативу: значения 8 и 9 отбрасываются, остальные отображаются через % 4. Доказать равномерность и вычислить вероятность принятия 0.8 и ожидаемое число попыток 1.25. Экспериментально сравнить обе гистограммы.
3. Почему наивное тасование смещено: Для массива длины 3 сравнить:
- Фишера—Йейтса;
- наивный алгоритм, который для каждого
i = 0,1,2меняетdata[i]сdata[rng.Next(3)].
Сначала полностью перебрать цепочки случайных индексов. У наивной схемы их 3^3 = 27, что не делится на 3! = 6; равномерное распределение перестановок невозможно. Для Фишера—Йейтса цепочек:
и каждой перестановке соответствует одна. Затем подтвердить различие большой эмпирической гистограммой шести перестановок.
4. Равномерные частоты не доказывают независимость: Сравнить две бинарные последовательности одинаковой длины:
- независимые биты
rng.Next(2); - первый бит случайный, каждый следующий равен
1 - previous.
У обеих доли нулей и единиц близки к 1/2. Дополнительно вычислить:
- матрицу переходов
00,01,10,11; - долю совпадений соседей;
- число серий;
- максимальную длину серии.
Показать, что гистограмма отдельных значений не обнаруживает детерминированное чередование. Сделать общий вывод: проверка одного свойства распределения не доказывает качество всей последовательности.
5. Равномерная точка в круге: Реализовать два корректных метода для круга радиуса R:
- отбраковка равномерных точек из квадрата
[-R, R) × [-R, R); - полярная схема:
Во второй части задачи явно разрешены Math.Sin, Math.Cos и Math.PI. Доказать площадь принятия первого метода π/4 и объяснить корень в формуле радиуса второго. Сравнить распределение по кольцам равной площади. Наивный радиус R * u исследовать отдельно и показать перенаселение центра.
6. Резервуарная выборка: Из последовательности заранее неизвестной длины выбрать k элементов, храня только массив длины k. Первые k элементов заполняют резервуар. Для элемента с индексом i >= k выбрать:
int j = rng.Next(i + 1);
и при j < k заменить reservoir[j]. Доказать индукцией, что после обработки i + 1 элементов каждый из них находится в резервуаре с вероятностью:
Массив используется только как имитация поступающего потока; алгоритм выбора не обращается к будущим элементам.
7. Редкое событие и нулевой счётчик: Событие — двадцать последовательных успехов честной монеты:
Для разных trials вычислить ожидаемое число наблюдений trials * p и вероятность не увидеть событие ни разу:
Провести серии с различными зёрнами. Объяснить, почему нулевой счётчик при ожидаемом числе значительно меньше единицы является нормальным результатом и не доказывает невозможность события. Показать практическую цену прямого Монте-Карло для редких исходов.
8. Коллекционер купонов: Есть typeCount равновероятных типов. Опыт заканчивается после появления всех типов. Вывести ожидание:
Обоснование: при collected различных типах вероятность получить новый равна (typeCount - collected) / typeCount, а среднее ожидание этой фазы — обратная величина. Симуляция использует bool[] seen, счётчик различных типов и страховочный предел. Сравнить среднее и медиану по множеству опытов и объяснить правый хвост распределения.
9. Расходящееся среднее: Бросать честную монету до первого неуспеха. Если перед ним произошло k успехов, выплата равна:
Вероятность уровня:
Вклад каждого уровня в математическое ожидание равен 1/2, а бесконечная сумма расходится. Для безопасного вычисления использовать k <= 60; достижение потолка учитывать как цензурированное наблюдение. Провести серии возрастающего размера и показать нестабильность выборочного среднего и сравнительную устойчивость медианы. Объяснить, почему существование наблюдаемого среднего конечной выборки не доказывает конечность теоретического ожидания.
10. Вероятностная проверка произведения матриц: Даны матрицы над полем остатков по простому модулю p:
Aформыm × n;Bформыn × q;- предполагаемый результат
Cформыm × q.
Один раунд Фрейвальдса:
- генерирует бинарный вектор
rдлиныq; - вычисляет
B * r; - вычисляет
A * (B * r); - вычисляет
C * r; - сравнивает результаты по модулю
p.
Если A * B == C, алгоритм принимает всегда. Если равенство неверно, один раунд ошибочно принимает с вероятностью не более 1/2; после rounds независимых раундов:
Использовать long для промежуточных произведений и малый простой модуль, гарантирующий представимость. Сравнить стоимость полного умножения O(mnq) и проверки:
Проверить корректную матрицу, матрицу с одной изменённой ячейкой и воспроизводимость результата при фиксированном зерне.
Обязательные контрольные наборы
| Задача | Исходные данные |
|---|---|
| I.1 | seed = 12345, по 20 значений каждой формы |
| I.2 | seed = 2026, одинаковая и сдвинутая трассы |
| I.3 | seed = 42, массивы длины 10 |
| I.4 | seed = 314159, count = 0,1,5,20 |
| I.5 | диапазоны [5,5], [-3,3], [1,6]; ошибочный вариант [1,6) |
| I.6 | диапазоны [-2.5,7.5), [0,1); p = 0,0.3,1 |
| I.7 | [], [10,20,30,40]; таблицы 0 × 4, 3 × 0, 3 × 5 |
| I.8 | массив длины 20, таблица 4 × 5, диапазон [-10,11), одинаковые и разные порядки обхода |
| I.9 | categoryCount = 6, trials = 100,10_000,1_000_000 |
| I.10 | массив [1,2,3,4,5,6,7,8], p = 0,0.5,1 |
| I.11 | [], [1], [0,1,2,3,4,5]; повтор одного зерна |
| I.12 | count = 0,1,10,1000, несколько зёрен |
| II.1 | trials = 10^2,10^4,10^6; не менее трёх зёрен |
| II.2 | p = 0.1,0.5,0.9, seriesCount = 100, trials = 1000 и 100_000 |
| II.3 | полный перебор 36 пар и не менее 1_000_000 случайных пар |
| II.4 | 10 бросков, не менее 200_000 опытов |
| II.5 | p = 1,0.5,1/6,0.01; maxAttempts задан отдельно |
| II.6 | groupSize = 1,2,23,40,365; поиск порога 0.5 |
| II.7 | веса [1], [1,1,1,1], [1,3,6], [0,5,0,5], недопустимые наборы |
| II.8 | n = 0,1,5,20; k = 0,1,n/2,n |
| II.9 | stepCount = 1,10,100,1000,10_000; не менее 10_000 блужданий |
| II.10 | trials = 10^3,10^5,10^7; не менее 20 серий для меньших размеров |
| II.11 | n = 1,2,5,10,100; не менее 100_000 перестановок |
| II.12 | пороги 17 и 19; не менее 100_000 общих сценариев |
| III.1 | один составной опыт, одно исходное зерно и одна намеренная дополнительная генерация |
| III.2 | источник 0..9, модуль 4, не менее 1_000_000 попыток |
| III.3 | массив [0,1,2]; полный перебор цепочек и не менее 1_000_000 тасований |
| III.4 | длина последовательности 1_000_000 |
| III.5 | R = 1, не менее 1_000_000 точек, 10 колец равной площади |
| III.6 | поток 0..n-1, n = 10,100, k = 1,3,10; частоты позиций |
| III.7 | trials = 10^4,10^5,2^20,10^7; несколько зёрен |
| III.8 | typeCount = 1,6,20,100; не менее 100_000 опытов для малых размеров |
| III.9 | размеры серий 10^2,10^4,10^6; потолок 60 успехов |
| III.10 | малые совместимые матрицы, простой модуль 1_000_003, rounds = 1,5,20 |
Итог модуля
Ученик рассматривает Random как детерминированный генератор состояния, задаёт и фиксирует зерно, передаёт единственный явный источник через границы методов и различает повтор по зерну и повтор по сохранённым случайным данным. Он использует полуоткрытые целые диапазоны, NextDouble, события Бернулли, равномерный и взвешенный выбор, независимое подмножество, Фишера—Йейтса, частичное тасование и резервуарную выборку и доказывает их границы, отсутствие повторов либо равномерность. Вероятностный эксперимент строится из аналитической модели, серии независимых прогонов, частот, средних и разброса; конечная выборка не объявляется доказательством распределения, а зерно не считается межверсионным форматом данных. Ученик выявляет смещение отображения и наивного тасования, различает равномерные маргинальные частоты и независимость и применяет Монте-Карло и одностороннюю вероятностную проверку с явной оценкой ошибки.
Покрытие опоры и границы
- Создание
Random, внутреннее состояние и явное зерно: I.1–I.4, I.12, III.1. Next(),Next(maxValue),Next(minValue, maxValue)и полуоткрытые диапазоны: I.1, I.5, I.7–I.9.NextDouble, масштабирование и событие с вероятностьюp: I.6, II.2, II.5, II.9–II.10.- Один источник на последовательность и передача параметром: I.3–I.4, I.8, I.12, II.1–II.12.
- Порядок вызовов, сдвиг состояния и воспроизводимость: I.2–I.4, I.12, III.1.
- Гистограммы, частоты, средние, дисперсия и разброс: I.9, II.1–II.6, II.9–II.12, III.2–III.9.
- Равномерный выбор элемента и координаты: I.7–I.8.
- Независимое подмножество: I.10.
- Равномерное тасование Фишера—Йейтса: I.11, II.11, III.3.
- Взвешенный выбор: II.7.
- Выбор ровно
kэлементов без повторов: II.8. - Резервуарная выборка: III.6.
- Сопоставление эмпирии с точной вероятностью и ожиданием: II.1–II.11, III.7–III.9.
- Общие случайные данные при сравнении стратегий: II.12.
- Смещение
%, отбраковка и равномерность отображения: III.2. - Маргинальные частоты, переходы и независимость: III.4.
- Равномерная генерация в геометрической области: III.5.
- Редкие события, тяжёлые хвосты и пределы выборочного среднего: III.7–III.9.
- Односторонняя вероятностная проверка и оценка ошибки: III.10.
За границей: Random не является криптографическим генератором и не применяется для секретов. Одинаковое зерно не гарантирует одинаковую последовательность между разными версиями и реализациями среды. Криптографическая случайность, устройство конкретных генераторов, статистические батареи качества, формальные доверительные интервалы, методы уменьшения дисперсии, Марковские цепи Монте-Карло, многопоточные источники и генераторы игровых движков относятся к последующим курсам. Частотное совпадение на конечной серии подтверждает только наблюдение в заданном протоколе и не доказывает независимость, равномерность или безопасность последовательности.

