В учебном скрипте нужно выбрать три записи из семи и получить тот же контрольный список при повторном запуске. Для этого недостаточно записать seed в заметках. Нужно сохранить исходные записи и их порядок, выбранную функцию, размер выборки, последовательность вызовов и среду выполнения.
Все ID в примере вымышлены. Это авторский учебный отбор, а не выбор участников реального исследования. Код выполнен в CPython 3.12.14 на Linux со стандартным модулем random. Показанные результаты относятся только к этому коду и указанному входу.
Зафиксируйте вход, seed и размер отбора
Исходный список содержит семь разных строк в заданном порядке:
['U01', 'U02', 'U03', 'U04', 'U05', 'U06', 'U07']
Метод sample выбирает элементы без возвращения, возвращает новый список в порядке отбора и не изменяет исходную последовательность. В этом примере все ID уникальны, поэтому в результате будут три разных ID. Если список содержит одинаковые значения в разных позициях, разные вхождения одного значения всё равно могут попасть в выборку.
| Условие | Значение в контрольном примере |
|---|---|
| Вход | Семь вымышленных ID в показанном порядке. |
| Генератор | Новый локальный объект random.Random(17). |
| Seed | Целое число 17, выбранное для учебного примера. |
| Операция | sample(ids, 3), без предварительных обращений к этому объекту. |
| Среда контроля | CPython 3.12.14, Linux; использована стандартная библиотека. |

Seed — начальное значение для инициализации генератора. Локальный объект Random имеет собственное состояние и не делит его с общим генератором модуля. В нашем коде дополнительный вызов rng.random() меняет состояние того же объекта. Поэтому вызов sample после дополнительного обращения к генератору и первый вызов на новом объекте с тем же seed являются разными условиями.
Полный код и контрольные вызовы
import random
ids = ["U01", "U02", "U03", "U04", "U05", "U06", "U07"]
def draw(source):
return random.Random(17).sample(source, 3)
print("control_1:", draw(ids))
print("control_2:", draw(ids))
rng = random.Random(17)
rng.random() # Дополнительный вызов в отдельном сценарии.
print("extra_call:", rng.sample(ids, 3))
rotated_ids = ids[1:] + ids[:1]
print("rotated_input:", draw(rotated_ids))
Приведённый код в CPython 3.12.14 дал следующий вывод. Первые две строки относятся к двум вызовам функции с новыми генераторами внутри одного выполнения скрипта:
control_1: ['U05', 'U04', 'U03']
control_2: ['U05', 'U04', 'U03']
extra_call: ['U07', 'U03', 'U06']
rotated_input: ['U06', 'U05', 'U04']
Первые два вызова совпали, потому что каждый раз создавался новый генератор Random(17) и использовался один и тот же список. Это результат данного учебного запуска, а не универсальный вывод официальной документации Python.
Почему лишний вызов меняет результат
В сценарии extra_call сначала выполняется random(), а затем sample(ids, 3). Seed и входной список не изменились, но генератор уже перешёл в другое состояние. В этом контрольном примере результатом стали U07, U03 и U06.
При проверке скрипта сравнивайте не только seed, но и все обращения к тому же объекту до нужной операции. Значение дополнительного случайного числа здесь не приводится: для вывода важно изменение последовательности вызовов.
Почему важен порядок входного списка
Для отдельного сценария список сдвигается на одну позицию:
['U02', 'U03', 'U04', 'U05', 'U06', 'U07', 'U01']
Функция draw снова создаёт новый генератор с seed 17. В этом контрольном примере она возвращает ['U06', 'U05', 'U04']. Набор возможных ID остался тем же, но изменился порядок элементов, поэтому те же случайно выбранные позиции соответствуют другим ID.
| Сценарий | Условия и результат |
|---|---|
| Контроль 1 | Новый Random(17), исходный порядок: U05, U04, U03. |
| Контроль 2 | Ещё один новый Random(17), те же условия: U05, U04, U03. |
| Лишний вызов | Новый Random(17), один random() перед sample: U07, U03, U06. |
| Другой порядок входа | Новый Random(17), сдвинутый список: U06, U05, U04. |
Что сохранить рядом со скриптом
- Версию и реализацию Python, а также используемые зависимости.
- Исходный список или файл, из которого он получен, вместе с порядком и правилами подготовки.
- Seed, размер выборки, имя функции и условия создания генератора.
- Последовательность обращений к генератору до контрольной операции.
- Команду запуска и ожидаемый вывод. Если важен порядок выбранных ID, укажите его явно.
Как записать интерпретатор, команду и ожидаемый результат, показывает пример фиксации окружения и контрольного запуска Python. Состав файлов можно описать по образцу README для исследовательских данных.
Границы воспроизводимости
Документация Python указывает, что большинство алгоритмов модуля random и функций инициализации могут меняться между версиями Python. Поэтому этот seed не даёт гарантии одинакового результата в любой другой версии. Для последовательной работы без параллельных потоков документация отдельно описывает сохранение последовательности метода random() при одинаковом seed и совместимом способе инициализации, но это не означает межверсионную гарантию для каждого метода модуля.
Повторяемый отбор не доказывает репрезентативность выборки, правильность плана исследования или обоснованность выводов. Не подбирайте seed ради желаемого набора записей и не выдавайте такой выбор за независимое подтверждение результата. Модуль random предназначен для псевдослучайных вычислений, а не для создания паролей и других задач безопасности. Для криптографических целей документация Python рекомендует модуль secrets.
Если контрольный результат не совпал, по очереди сравните порядок входных данных, размер выборки, seed, создание нового генератора, предшествующие вызовы и версию среды. Не заменяйте полученный список вручную ожидаемым. Сохраните расхождение и установите его причину.
При подготовке собственного исследовательского расчёта можно обсудить помощь со статистическим анализом. Заранее согласуйте вопрос, исходные файлы и объём консультации. Совпадение контрольного вывода и обоснование метода исследования — разные задачи.
Источник
Официальная документация Python 3.12: random описывает метод sample, собственные генераторы Random, состояние генератора и ограничения воспроизводимости. ID, сценарии и контрольные результаты в статье составляют самостоятельный учебный пример.