Попытка сгенерировать несколько интервалов цифр в одном числе (LUA)

В основном мне приходится использовать случайную функцию, которая может возвращать число от 0 до 2^16-1.

Я пытаюсь использовать это и генерировать, скажем, 6 интервалов между 1 и 6 (думая о покере с костями). В основном используйте тот номер, который сгенерирован для меня случайным образом (я могу указать только диапазон), и желательно, чтобы он вызывался только один раз. Затем возьмите это число и «разделите» его на 6 кубиков, где значения будут находиться в диапазоне от 1 до 6.

Я немного не уверен в технике, которую можно было бы использовать, одна вещь, которая приходит на ум, это битовая маскировка, но я не уверен, что это правильный контекст.

С бинарной точки зрения разумно иметь значения костей от 0 до 5. Это дало бы нам двоичное число 000-101. Теперь максимальное значение возвращаемой случайной функции будет 101101101101101101 (шесть игральных костей, каждая из которых равна «6»), а в десятичном виде это означает, что верхняя граница случайного целочисленного возврата будет равна 187245. Нижняя граница будет равна 0. Теперь скажем, Функция random возвращает нам число 66508, переводя его в двоичную форму, мы получаем 010|000|001|111|001|100, а этого недостаточно! В этом случае один из кубиков будет 111 = 7, и мы не можем получить это, когда интервал должен быть 0-5 (1-6) :(

Мне нужно выяснить, как десятичная дробь в пределах диапазона может содержать шесть кубиков со значениями 1-6 (0-5), но мне нужна помощь.


person Vlad    schedule 13.12.2009    source источник
comment
Не делайте этого с битовой маской в ​​двоичном формате... работайте в базе 6, как в ответе Марка Байерса.   -  person Pascal Cuoq    schedule 13.12.2009
comment
Какое отношение этот вопрос имеет к Lua?   -  person lhf    schedule 29.12.2009


Ответы (1)


Вы можете использовать значения x % 6, (x / 6) % 6, (x / 6^2) % 6, ..., (x / 6^5) % 6, где x — число из вашего генератора случайных чисел. Если вы сделаете это, будет предвзятость. Вы должны отклонить x и повторно выбрать, если он больше 6**6-1, если вы хотите избежать этого смещения.

person Mark Byers    schedule 13.12.2009
comment
Прекрасный! Я был уверен, что мод будет использоваться в решении. :) - person Vlad; 13.12.2009
comment
Хороший алгоритм генерации однородных случайных чисел от 0 до n с использованием модуля вы можете увидеть java.util.Random.nextInt(int): java.sun.com/javase/6/docs/api/java/util/ - person Joey; 13.12.2009