Ошибка игрока - это когнитивное искажение, в котором мы ошибочно ожидаем, что случившееся часто будет менее вероятным в будущем, а то, что не произошло через некоторое время, с большей вероятностью произойдет в ближайшее время. Ваша задача - реализовать конкретную версию этого.
Объяснение проблемы
Напишите функцию, которая возвращает случайное целое число от 1 до 6 включительно. Подвох: при первом запуске функции результат должен быть равномерным (в пределах 1%), однако каждый последующий вызов будет перекошен в пользу значений, которые были свернуты меньшее количество раз ранее. Конкретные детали заключаются в следующем:
- Жребий запоминает количество сгенерированных на данный момент чисел.
- Каждый результат взвешивается по следующей формуле:
- Например, если количество бросков до сих пор составляет , веса будут , то есть вы будете В 4 раза больше шансов бросить чем .
- Обратите внимание, что формула означает, что результат броска взвешивается так же, как
Правила и предположения
- Применяются стандартные правила ввода / вывода и запрещенные лазейки
- Ролики не должны быть детерминированными. (т. е. используйте PRNG, посеянный из энергозависимого источника, который обычно доступен как встроенный.)
- Ваш случайный источник должен иметь период не менее 65535 или быть истинной случайностью.
- Распределения должны быть в пределах 1% для веса до 255
- 16-битные RNG достаточно хороши, чтобы удовлетворить оба вышеуказанных требования. Достаточно большинства встроенных ГСЧ.
- Вы можете передать текущее распределение, если это распределение либо мутирует по вызову, либо распределение после броска возвращается вместе с броском штампа. Обновление дистрибутива / количества является частью этой проблемы .
- Вы можете использовать вес вместо подсчета. При этом всякий раз, когда вес падает до 0, все веса должны увеличиваться на 1 для достижения того же эффекта, что и при подсчете веса.
- Вы можете использовать эти веса в качестве повторений элементов в массиве.
Удачи. Пусть байты всегда будут в твою пользу.
Ответы:
R , 59 байт
Попробуйте онлайн!
Сохраняет количество
T
, которое затем преобразуется для использования в качествеweights
аргументаsample
(что затем, скорее всего, нормализует их для суммирования1
).[<<-
Оператор используется для присвоения значенияT
в одной из родительских сред (в данном случае, единственный родитель среда.GlobalEnv
).источник
T
? (Помимо того, что код становится труднее читать!)T
илиF
внутренне для этой функции, а потом мне было лень ее менять, когда я понял, что мне нужно глобальное назначение.pawl
.Python 3 ,
11299 байтПопробуйте онлайн!
объяснение
Изменить: Сохранено 13 байт. Спасибо, attinat !
источник
c,=
и удаление[0]
). Также стоит отметить, чтоchoices
это Python 3.6+05AB1E , 13 байтов
Попробуйте онлайн!
Принимает список отсчетов в качестве входных данных. Выводит рулон и новые счета.
Объяснение:
источник
JavaScript (ES8), 111 байт
Попробуйте онлайн!
Как?
Это довольно наивная и, скорее всего, неоптимальная реализация, которая выполняет моделирование, как описано.
Мы продолжаем отслеживать граф в . На каждом броске мы строим строку состоящую из каждого кубика, который повторял раз, и выбираем случайную запись там с равномерным распределением.C s i max(C)−Ci+1
источник
APL (Dyalog Unicode) , 32 байта SBCS
-4 байта с использованием репликации вместо интервала индекса.
Попробуйте онлайн!
Определяется как функция, которая принимает текущее распределение в качестве аргумента, печатает полученный бросок кубика и возвращает обновленное распределение. Первый запуск на TIO - это 100 вызовов, начиная с
[0,0,0,0,0,0]
, второй запуск сильно смещен в сторону 1 с[0,100,100,100,100,100]
, а последний запуск сильно смещен в сторону 6 таким же образом.источник
Perl 6 , 31 байт
Попробуйте онлайн!
Принимает текущее распределение веса как BagHash, начиная с единицы, где все веса равны 1. Распределение мутирует на месте.
Метод BagHash
pick
выбирает ключ случайным образом, используя соответствующие веса; вес этого ключа затем уменьшается на единицу. Если этот вес становится равным нулю,++«.{1..6}
увеличивается вес всех чисел 1-6.источник
Wolfram Language (Mathematica) , 91 байт
Попробуйте онлайн!
источник
Javascript (ES6 +), 97 байт
объяснение
Обратите внимание, что это в конечном итоге взорвется, если
w
превысит длину 2 32 -1, что является максимальной длиной массива в js, но вы, вероятно, достигнете предела памяти до этого, учитывая, что 32-битный массив int 2 32 -1 длиной 16 ГБ, а некоторые (большинство?) Браузеры не позволяют использовать более 4 ГБ.источник
Perl 6 , 49 байт
Попробуйте онлайн!
Принимает предыдущие рулоны как Мешок (мультимножество). Возвращает новый рулон и новый дистрибутив.
объяснение
источник
Pyth ,
2220 байтПопробуйте онлайн!
Ввод - это предыдущие частоты в виде списка, выводит следующий бросок и обновленные частоты, разделенные новой строкой.
источник
Желе , 12 байт
Попробуйте онлайн!
Монадическая ссылка, которая принимает один аргумент, текущий список счетчиков и возвращает список выбранного числа и обновленный список счетчиков.
Желе , 18 байт
Попробуйте онлайн!
В качестве альтернативы, вот нильадная ссылка, которая возвращает выбранное число и отслеживает список счетчиков в регистре.
источник