Введение
Вам дан случайный целочисленный генератор со следующей реализацией
- Первый вызов всегда возвращает 1.
- Второй вызов возвращает случайное целое число от 1 до 2.
- Третий вызов возвращает случайное целое число от 1 до 3.
- N-й вызов возвращает случайное целое число от 1 до n включительно.
Основываясь на вышеупомянутой функции, напишите генератор случайных костей, который является совершенно случайным, возвращая значение от 1 до 6 (включительно) с равной вероятностью.
правила
- Ваша программа / функция должна приводить к случайному целому числу от 1 до 6 включительно в некоторой пригодной для использования форме, т. Е. К стандартному выводу или в качестве возвращаемого значения функции.
- Вышеуказанный генератор восходящих случайных чисел может быть определен как «свободная» функция в вашей программе (т. Е. Не учитывается при подсчете количества символов) или как отдельный скрипт / программа, которая выполняется по мере необходимости, при условии сохранения состояния (
n
) между звонками. - Предположим, что в одном случае использования вашей программы будет запрошено не более 1000 бросков игральных костей, и первоначальный генератор случайных чисел может быть сброшен
1
в конце 1000 бросков игральных костей, чтобы избежать переполненияn
. - Ваша программа не может использовать какой-либо другой источник случайных чисел, кроме генератора случайных чисел по возрастанию, определенного выше. Конечно, вы можете запросить несколько случайных чисел у генератора случайных чисел для каждого отдельного результата броска костей.
- Это код-гольф, поэтому победитель - самый короткий ответ или большинство голосов в случае ничьей. Если вы можете сгенерировать 1000 бросков костей, используя менее 1000 сгенерированных случайных чисел, дайте себе 10-очковый бонус эффективности .
пример
./asc-rand
1 # random integer between 1 and 1
./asc-rand
1 # random integer between 1 and 2
./asc-rand
3 # random integer between 1 and 3
./asc-rand
4 # random integer between 1 and 4
# dice-gen generates random dice based on output of asc-rand program.
./dice-gen
3
./dice-gen
6
./dice-gen
5
./dice-gen
1
iterate(6):b=asc-rand(); print b
незаконна или не работает? Я мог бы неправильно понять третье правило.Ответы:
J - 13 символов
Это делает те же предположения, что и в Golfscript: количество игральных костей указано в stdin, и мы перечисляем броски костей, которые должны появиться.
Объяснил взрывом:
Если это как-то неудовлетворительно, вот более длинная программа из 21 символа, которую можно вызывать
f''
для генерации случайных чисел с состоянием и всем остальным.источник
r:{*1_draw x}
, стандартная версия (10 символов)r'1+!. 0:`
, функциональная версия (14 символов),c:0;f:{r@c+:1}
вызываемаяf[]
.Питон, 31 символ
Аналогично scleaver, определите генератор следующим образом:
Затем функция для возврата бросков костей:
Звоните в
D()
любое время, когда вам нужен случайный бросок костей.источник
Скала 23
Метод r может быть (примерно) реализован так:
грубый тест:
Каждый шестой вызов должен давать равное распределение по 6 значениям, поэтому я выбрасываю 5.
источник
GolfScript (15 символов)
Это предполагает, что количество требуемых бросков указано в stdin, и перечисляет столько результатов в stdout.
Онлайн демо
Хотя я мог получить бонус в 10 баллов за использование менее 1000 бросков для генерации 1000 чисел, это стоило бы мне гораздо больше, чем 10 символов. Тривиальный подход извлечения подходящей энтропии, когда N кратно степени 2 или 3, значительно сокращается, потому что число доступных результатов в моде 3 составляет всего 333 + 111 + 37 + 12 + 4 + 1 = 498. Поэтому необходимо принять образец и отклонить подход. Используя этот подход, вы можете получить ожидаемые 2242 броска от 1000 звонков до
r
, но есть дополнительные накладные расходы на бухгалтерию иbase
это очень длинное имя функции.источник
base
это очень длинное имя функции" Вы, очевидно, не используете Mathematica . Мы получаем такие чудеса , какNegativeBinomialDistribution
,ExponentialGeneratingFunction
,MathieuCharacteristicExponent
,InverseFourierSequenceTransform
иSemialgebraicComponentInstances
. :-)Python
6563Функция
R()
является восходящим рандомизатором.Применение:
источник
for
цикла и просто позвонитьR
один раз перед вашимwhile
циклом?R()
возвращал число с плавающей точкой, и вы брали наименее значимую цифру. Теперь, когда выяснено, чтоR()
возвращает целое число, это имеет смысл.Python, 56
r определяется как:
генератор костей d:
использование, например, для 100 рулонов:
источник
import math
если вы заменитеmath.ceil(...)
наint(...)+1
Mathematica 51
Генератор случайных чисел,
r
сбрасывается путем установки глобальной переменной равнойn
1.Код
Не в бегах за самый короткий код ...
Применение
Для 60000 бросков игральных костей требуется 60031 звонок
h
.Tally
показывает разбивку по номерам 1-6.источник
Perl, 22 или 45
Реализация генератора восходящих случайных чисел:
Генерация:
Тестирование:
источник
JavaScript (Node.js) , 35 байт
Попробуйте онлайн!
источник
код операции x86, 15 байт
источник
GolfScript , 8 байт
Попробуйте онлайн!
Он запускает генератор один раз, а затем избавляется от результата. Затем он бросает f2 и умножает его на 3 (3 или 6), затем вычитает f3-1 (0, 1, 2), что приводит к (3-2, 3-1, 3-0) или (6-2, 6-1, 6-0) W5.
Golfscript и случайная функция существовали до того, как этот вопрос был опубликован, так же как и юридическое представление.
Это отправка только один раз. Если вам нужно запустить его несколько раз за один звонок,
GolfScript , 12 байт
Попробуйте онлайн!
Это сбрасывает ваш я звоню на 0, поэтому он сбрасывается соответственно. Этот TIO показывает 50 случайных результатов.
источник
C (gcc) , 31 байт
При каждых 6 вызовах вероятность каждого сгенерированного числа от 1 до 6 включительно равна.
c
это#define
d как вызов функции, которая генерирует идеальные случайные числа.Попробуйте онлайн!
источник