Как все мы знаем, современные операционные системы имеют планировщики потоков, которые могут выбирать различные заказы для планирования ваших потоков на основе внутренней логики, к которой ваш код не относится. Обычно вы разрабатываете свой многопоточный код, чтобы гарантировать, что наложенный на вас недетерминизм не окажет существенного влияния на ваш вывод.
Цель здесь противоположна. Создайте программу, которая печатает целые числа в интервале [0,99], но в порядке, который будет варьироваться от запуска к запуску из-за планировщика потока ОС.
Вы должны достичь «достаточного недетерминизма», определяемого как:
В 10 последовательных наборах из 10 испытаний ваша программа должна производить не менее 9 уникальных перестановок в каждом испытании. У вас может быть разумное количество неудачных наборов испытаний по обе стороны от 10 последовательных, которые будут успешными.
Или, другими словами, вам нужно 100 прогонов вашей программы, где каждый блок из 10 прогонов имеет не более двух прогонов, которые выдают одну и ту же вещь.
Таким образом, иногда замена 98 и 99 не приведет к сокращению.
Это код-гольф , поэтому ответ, который использует наименьшее количество байтов, выигрывает.
мелочи
- Запишите свой вывод на стандартный вывод, по одной записи в строке
- Если вы изменяете формат с помощью чередования двух потоков записи символов в стандартный вывод (даже иногда), что приводит к таким вещам, как трехзначные числа или пустые строки, ваш результат будет недействительным
- Единственное исключение из приведенного выше правила состоит в том, что вы можете выдать одну пустую строку после печати последнего требуемого номера (пожалуйста)
- Если вы когда-нибудь пропустите или продублируете обязательные значения, ваш результат будет недействительным
- Ваша программа не должна быть недетерминированной на одноядерном процессоре (хотя, если вам так хочется)
- Ваша программа может использовать зеленые потоки / волокна, которые на самом деле не управляются ядром ОС, если она все еще отвечает другим требованиям задачи, а система потоков является частью вашего языка или стандартной библиотеки для вашего языка.
- Время выполнения вашей программы должно быть надежно менее 5 секунд на современном процессоре
- Вы не можете указать изменения в среде, которые происходят вне вашей программы, такие как ожидание или изменение настроек; ваша программа должна проходить независимо от того, запускается ли она 100 раз подряд или с интервалом в час между каждым запуском или 100 раз параллельно (это, вероятно, поможет на самом деле ...)
- Вы можете использовать сопроцессор, такой как GPU или Xeon Phi, и собственный механизм внутреннего планирования для задач. Правила применяются к этому так же, как к зеленым нитям.
- Не стесняйтесь спровоцировать планировщик всевозможными снами, выходами и другими хитростями, если вы подчиняетесь правилам, указанным в этом посте.
Запрещенные операции
Единственный источник недетерминизма, на который вам разрешено рисовать, - это когда планировщик планирует запуск ваших потоков. Следующий список не является исчерпывающим и предназначен только для того, чтобы предоставить примеры того, что вам не разрешено делать, поскольку они допускают другие источники недетерминизма.
- Прямой или косвенный доступ к любому виду возможностей PRNG или аппаратного RNG (если только он не является неотъемлемой частью планировщика).
- Чтение в любом виде ввода (системное время, файловая система, сеть и т. Д.)
- Чтение идентификаторов потоков или идентификаторов процессов
- Настройка планировщика ОС; вы должны использовать стандартный планировщик ОС из основной ОС
- Настройка вашего зеленого планировщика нитей / волокон также запрещена. Это означает, что если вы пишете язык для этой задачи, вы должны использовать потоки ОС.
Подтверждение ответа
Желательно, чтобы ответ работал во всех распространенных операционных системах и современных процессорах, а почетность награды была пропорциональна широте поддержки. Тем не менее, это не требование задачи. Как минимум ответ должен поддерживать один современный процессор SMP и современную ОС. Я опробую опережающие ответы в зависимости от доступности моего оборудования.
- Если ваша запись не произведет требуемый вывод на i7 5960x под управлением Windows 10 v1607 x64, укажите требуемую среду
- Если это что-то, что я могу легко воспроизвести с VMWare Workstation, предоставьте точные спецификации ОС и ВМ
- Если он не может быть воспроизведен ни в одном из этих условий, запишите одновременный снимок экрана теста, как описано в разделе заголовка, и ручную видеозапись вашего экрана с помощью взаимодействия мыши и клавиатуры (или какой-либо другой схемы управления вашими нестандартными вычислениями). устройство использует) четко видны и публикуют оба видео вместе с вашим ответом и включают объяснение того, почему оно работает
- В качестве альтернативы, получите уважаемого давнего пользователя (который не является вами) с соответствующим оборудованием, чтобы воспроизвести результат и поручиться за вас
- Если ваша запись написана на экзотическом языке программирования, который типичный разработчик не настроит на компиляцию / jit / интерпретацию, предоставьте инструкции по установке
- Если ваша запись зависит от конкретной версии интерпретатора JVM / Python / другой, укажите, какая
- Если вам потребуется более 10 минут последовательных прогонов, чтобы получить 10 успешных последовательных наборов испытаний в моем тестировании, вы провалите (поэтому не допускайте, чтобы условие успеха было странным, особенно если вы находитесь на верхнем уровне). время выполнения)