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()

Для каждого вызова проверить соответствующий контракт:

0Next()<int.MaxValue,0\le Next()<int.MaxValue, 0Next(10)<10,0\le Next(10)<10, 5Next(5,6)<6,-5\le Next(-5,6)<6, 0NextDouble()<1.0\le NextDouble()<1.

Вывести минимум и максимум каждой фактически полученной серии, не подменяя ими гарантированные границы API. Объяснить полуоткрытость и связь [0, n) с допустимыми индексами массива.

2. Зерно, состояние и сдвиг фазы: Создать два генератора с одинаковым зерном. Выполнить у них одинаковую последовательность из вызовов разных форм и подтвердить поэлементное совпадение. Затем создать новую пару с тем же зерном, но у первого генератора заранее отбросить один результат Next(). Показать сдвиг дальнейшей последовательности. Сформулировать условие воспроизводимости: одинаковы зерно, реализация и полный порядок вызовов.

3. Ловушка повторного создания: Сравнить:

  1. заполнение массива одним Random(seed);
  2. создание нового 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)

Предусловие:

minimummaximum<int.MaxValue.minimum\le maximum<int.MaxValue.

Метод вызывает:

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)

Для первого метода математическая схема:

x=minimum+(maximumminimum)u,u[0,1).x=minimum+(maximum-minimum)u, \qquad u\in[0,1).

Предусловия: конечные 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. Проверить:

i=0m1countsi=trials.\sum_{i=0}^{m-1}counts_i=trials.

Для каждой категории вычислить частоту, абсолютное отклонение от 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 испытаний. Каждая серия создаётся отдельным заранее заданным зерном. Получить массив оценок частоты и вычислить среднее и стандартное отклонение:

s=1Mi=1M(p^ip)2.s= \sqrt{ \frac{1}{M} \sum_{i=1}^{M} (\hat p_i-\overline p)^2 }.

Сравнить с теоретическим масштабом:

σp^=p(1p)trials.\sigma_{\hat p} = \sqrt{\frac{p(1-p)}{trials}}.

Повторить для 100 * trials и проверить приблизительное десятикратное уменьшение разброса.

3. Сумма двух костей: Сначала тройным? Нет, двойным циклом перебрать все 36 упорядоченных пар граней и получить точное число исходов для сумм от 2 до 12. Затем провести случайную серию и сравнить частоты с:

P(S=s)=counts36.P(S=s)=\frac{count_s}{36}.

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

4. Биномиальное распределение: Один опыт состоит из 10 независимых честных бросков монеты; результат — число успехов. Вычислить коэффициенты:

C(10,k)C(10,k)

без факториалов большого размера и получить точные вероятности:

P(X=k)=C(10,k)210.P(X=k)=\frac{C(10,k)}{2^{10}}.

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

5. Число попыток до первого успеха: Для вероятности 0 < p <= 1 повторять испытания до первого успеха. Каждый опыт имеет страховочный maxAttempts; достижение потолка учитывается отдельно и не подменяется обычным успехом. По множеству опытов оценить среднее число попыток и сравнить с:

E[X]=1p.E[X]=\frac{1}{p}.

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

6. Совпадение дней рождения: Для группы из groupSize <= 365 аналитически вычислить вероятность отсутствия совпадений:

Pdistinct=i=0groupSize1365i365,P_{\mathrm{distinct}} = \prod_{i=0}^{groupSize-1} \frac{365-i}{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);
  • выбран первый накопленный интервал, правая граница которого больше броска.

Доказать:

P(index=i)=weightsijweightsj.P(index=i)=\frac{weights_i}{\sum_j weights_j}.

Нулевой вес никогда не выбирается.

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. Вычислить:

  • среднюю конечную позицию;
  • средний квадрат позиции;
  • дисперсию;
  • средний модуль позиции.

Сравнить с теоретическими свойствами:

E[X]=0,E[X2]=stepCount.E[X]=0, \qquad E[X^2]=stepCount.

Повторить для нескольких размеров и проверить рост типичного модуля порядка stepCount\sqrt{stepCount}.

10. Оценка площади методом Монте-Карло: Генерировать точки (x, y) в единичном квадрате и считать попадания в четверть единичного круга:

x2+y21.x^2+y^2\le1.

Оценка:

π^=4insidetrials.\widehat{\pi} = 4\frac{inside}{trials}.

Для каждого размера выполнить несколько независимых серий, вывести среднее, размах и ошибку относительно Math.PI. Объяснить происхождение формулы из отношения площадей и то, почему увеличение числа точек не гарантирует монотонное улучшение каждого отдельного прогона.

11. Неподвижные точки случайной перестановки: Перемешать массив 0,1,\ldots,n-1 алгоритмом Фишера—Йейтса и подсчитать позиции i, где data[i] == i. По множеству перестановок оценить среднее число неподвижных точек. Аналитически через индикаторы получить:

E[X]=i=0n1P(datai=i)=n1n=1.E[X] = \sum_{i=0}^{n-1}P(data_i=i) = n\cdot\frac{1}{n} = 1.

Объяснить, почему линейность ожидания не требует независимости событий.

12. Сравнение стратегий на общих случайных данных: Один сценарий — заранее сгенерированный массив из 21 положительного значения из [1, 10]; такой длины достаточно для достижения обоих порогов даже при последовательности единиц. Стратегия с порогом t складывает значения до достижения не менее t; сумма выше 21 даёт результат 0, иначе результат равен сумме. Сравнить пороги 17 и 19:

  1. на общих массивах сценариев;
  2. на независимых случайных массивах для каждой стратегии.

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


Уровень III. Экспертный

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

1. Что именно воспроизводит зерно: Провести один составной эксперимент, включающий выбор, тасование и остановку по случайному событию. Сохранить:

  • зерно;
  • версию .NET;
  • порядок вызовов;
  • все непосредственно сгенерированные примитивные значения.

Показать три режима воспроизведения:

  1. то же зерно и тот же код в текущей среде;
  2. то же зерно после добавления одного лишнего вызова;
  3. повтор по сохранённому массиву случайных значений без Random.

Сформулировать границу: зерно воспроизводит состояние конкретной реализации и трассы вызовов, а сохранённые случайные данные воспроизводят сам вход алгоритма независимо от будущего поведения генератора.

2. Смещение операции % и отбраковка: Рассмотреть идеальный равномерный источник цифр 0..9, реализованный как rng.Next(10). Отображение:

digit % 4

даёт точные вероятности:

310,310,210,210.\frac{3}{10}, \frac{3}{10}, \frac{2}{10}, \frac{2}{10}.

Реализовать равномерную альтернативу: значения 8 и 9 отбрасываются, остальные отображаются через % 4. Доказать равномерность и вычислить вероятность принятия 0.8 и ожидаемое число попыток 1.25. Экспериментально сравнить обе гистограммы.

3. Почему наивное тасование смещено: Для массива длины 3 сравнить:

  • Фишера—Йейтса;
  • наивный алгоритм, который для каждого i = 0,1,2 меняет data[i] с data[rng.Next(3)].

Сначала полностью перебрать цепочки случайных индексов. У наивной схемы их 3^3 = 27, что не делится на 3! = 6; равномерное распределение перестановок невозможно. Для Фишера—Йейтса цепочек:

321=6,3\cdot2\cdot1=6,

и каждой перестановке соответствует одна. Затем подтвердить различие большой эмпирической гистограммой шести перестановок.

4. Равномерные частоты не доказывают независимость: Сравнить две бинарные последовательности одинаковой длины:

  1. независимые биты rng.Next(2);
  2. первый бит случайный, каждый следующий равен 1 - previous.

У обеих доли нулей и единиц близки к 1/2. Дополнительно вычислить:

  • матрицу переходов 00, 01, 10, 11;
  • долю совпадений соседей;
  • число серий;
  • максимальную длину серии.

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

5. Равномерная точка в круге: Реализовать два корректных метода для круга радиуса R:

  1. отбраковка равномерных точек из квадрата [-R, R) × [-R, R);
  2. полярная схема:
r=Ru,θ=2πv,r=R\sqrt{u}, \qquad \theta=2\pi v, x=rcosθ,y=rsinθ.x=r\cos\theta, \qquad y=r\sin\theta.

Во второй части задачи явно разрешены 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 элементов каждый из них находится в резервуаре с вероятностью:

ki+1.\frac{k}{i+1}.

Массив используется только как имитация поступающего потока; алгоритм выбора не обращается к будущим элементам.

7. Редкое событие и нулевой счётчик: Событие — двадцать последовательных успехов честной монеты:

p=220.p=2^{-20}.

Для разных trials вычислить ожидаемое число наблюдений trials * p и вероятность не увидеть событие ни разу:

(1p)trials.(1-p)^{trials}.

Провести серии с различными зёрнами. Объяснить, почему нулевой счётчик при ожидаемом числе значительно меньше единицы является нормальным результатом и не доказывает невозможность события. Показать практическую цену прямого Монте-Карло для редких исходов.

8. Коллекционер купонов: Есть typeCount равновероятных типов. Опыт заканчивается после появления всех типов. Вывести ожидание:

E[T]=typeCount(1+12++1typeCount).E[T] = typeCount \left( 1+\frac12+\dots+\frac{1}{typeCount} \right).

Обоснование: при collected различных типах вероятность получить новый равна (typeCount - collected) / typeCount, а среднее ожидание этой фазы — обратная величина. Симуляция использует bool[] seen, счётчик различных типов и страховочный предел. Сравнить среднее и медиану по множеству опытов и объяснить правый хвост распределения.

9. Расходящееся среднее: Бросать честную монету до первого неуспеха. Если перед ним произошло k успехов, выплата равна:

2k.2^k.

Вероятность уровня:

P(X=2k)=2(k+1).P(X=2^k)=2^{-(k+1)}.

Вклад каждого уровня в математическое ожидание равен 1/2, а бесконечная сумма расходится. Для безопасного вычисления использовать k <= 60; достижение потолка учитывать как цензурированное наблюдение. Провести серии возрастающего размера и показать нестабильность выборочного среднего и сравнительную устойчивость медианы. Объяснить, почему существование наблюдаемого среднего конечной выборки не доказывает конечность теоретического ожидания.

10. Вероятностная проверка произведения матриц: Даны матрицы над полем остатков по простому модулю p:

  • A формы m × n;
  • B формы n × q;
  • предполагаемый результат C формы m × q.

Один раунд Фрейвальдса:

  1. генерирует бинарный вектор r длины q;
  2. вычисляет B * r;
  3. вычисляет A * (B * r);
  4. вычисляет C * r;
  5. сравнивает результаты по модулю p.

Если A * B == C, алгоритм принимает всегда. Если равенство неверно, один раунд ошибочно принимает с вероятностью не более 1/2; после rounds независимых раундов:

Perror2rounds.P_{\mathrm{error}}\le2^{-rounds}.

Использовать long для промежуточных произведений и малый простой модуль, гарантирующий представимость. Сравнить стоимость полного умножения O(mnq) и проверки:

O(rounds(nq+mn+mq)).O\bigl(rounds\cdot(nq+mn+mq)\bigr).

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


Обязательные контрольные наборы

ЗадачаИсходные данные
I.1seed = 12345, по 20 значений каждой формы
I.2seed = 2026, одинаковая и сдвинутая трассы
I.3seed = 42, массивы длины 10
I.4seed = 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.9categoryCount = 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.12count = 0,1,10,1000, несколько зёрен
II.1trials = 10^2,10^4,10^6; не менее трёх зёрен
II.2p = 0.1,0.5,0.9, seriesCount = 100, trials = 1000 и 100_000
II.3полный перебор 36 пар и не менее 1_000_000 случайных пар
II.410 бросков, не менее 200_000 опытов
II.5p = 1,0.5,1/6,0.01; maxAttempts задан отдельно
II.6groupSize = 1,2,23,40,365; поиск порога 0.5
II.7веса [1], [1,1,1,1], [1,3,6], [0,5,0,5], недопустимые наборы
II.8n = 0,1,5,20; k = 0,1,n/2,n
II.9stepCount = 1,10,100,1000,10_000; не менее 10_000 блужданий
II.10trials = 10^3,10^5,10^7; не менее 20 серий для меньших размеров
II.11n = 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.5R = 1, не менее 1_000_000 точек, 10 колец равной площади
III.6поток 0..n-1, n = 10,100, k = 1,3,10; частоты позиций
III.7trials = 10^4,10^5,2^20,10^7; несколько зёрен
III.8typeCount = 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 не является криптографическим генератором и не применяется для секретов. Одинаковое зерно не гарантирует одинаковую последовательность между разными версиями и реализациями среды. Криптографическая случайность, устройство конкретных генераторов, статистические батареи качества, формальные доверительные интервалы, методы уменьшения дисперсии, Марковские цепи Монте-Карло, многопоточные источники и генераторы игровых движков относятся к последующим курсам. Частотное совпадение на конечной серии подтверждает только наблюдение в заданном протоколе и не доказывает независимость, равномерность или безопасность последовательности.