Реализуйте программу или функцию, которая имитирует обычные кости для ролевых игр. Он должен обрабатывать как минимум d6 и d20, два самых распространенных кубика.
Тем не менее, он должен работать так, как ожидают от него стереотипные геймеры, а не как настоящая игра в кости.
Это игра в шутку между игроками, что можно получить особенно удачный кубик для очень очень важного броска, предварительно бросив много кубиков, выбрав те, которые привели к «1», затем бросая их снова, пока вы не получите несколько, которые бросили "1" несколько раз. Затем вы тщательно сохраняете их, потому что они бросают 1 несколько раз подряд, поэтому вероятность бросить 1 в следующий раз должна быть чрезвычайно низкой.
Конечно, это не так, как кости работают в реальной жизни , потому что броски являются статистически независимыми.
Ваши смоделированные кубики должны учитывать предыдущие броски и работать так же, как и игрок, ошибочно полагая, что он сработает. Например, если выпало много младших чисел, вероятность увеличения большего числа должна быть увеличена.
Однако, поскольку это обман, вы должны хорошо это скрывать . Это означает, что случайный взгляд на программу не должен показывать, что вы обманули. Это означает, что явно сохранять предыдущие результаты и читать их при каждом броске было бы слишком подозрительно. Вы должны скрыть это «свойство» ваших костей и бонусные очки, если вы сделаете его правдоподобным, отрицающим и замаскируете его как честную ошибку. (например, вы делаете свой собственный ГСЧ с «непреднамеренным» недостатком)
Избиратели, примите во внимание, насколько хорошо скрыт этот «недостаток».
Программы должны быть понятными, а не запутанными. Слишком легко спрятать злой код в запутанной программе.
getRandomBetween(1,d)
заставило бы меня глубже вникнуть в это.Ответы:
Ява
Это так просто, что он, очевидно, ничего не скрывает: он
java.util.Random
является прямым линейным конгруэнтным генератором и использует метод отбрасывания для обеспечения однородности, поэтому он гарантирует, что при любом запуске наибольшего кратного изsize
менее чем 2 48 выборок он будет распределять числа равномерно, удовлетворяющие требованию.источник
java.util.Random
выполняет, имеет очень мало общего с поведением этого ответа. На самом деле, этот ответ основан на том факте, что, как и у любого ГСЧ,java.util.Random
есть период, и если вы генерируете число чисел порядка этого периода, его статистические свойства нарушаются. Это не очень интересно; то же самое произошло бы даже с криптографически защищенным ГСЧ, таким как Blum Blum Shub, если вы выполняете его достаточно долго.Рубин
В настоящее время поддерживает только d6, позже добавлю поддержку d20 ...
И вот, эти кубики противны!
источник
Haskell
Используйте одну случайную вещь, чтобы сделать другую случайную вещь: в этом случае перетасуйте карты, чтобы генерировать броски костей.
Принимает один аргумент, количество лиц на кубике. Вывод такой:
... и так далее для всех карт (сбросы не печатаются). Слишком очевидно?
источник