Основной ответ здесь кажется правильным - если ваше случайное число 0..32 больше 25, используйте reroll.Тем не менее, вы можете сложить шансы против произвольно длинного результата, посмотрев на коэффициент, кратный 26, что дает меньше шансов на длинную ставку.
32 - 26 = 6
64 - 52 = 12
128 - 78 = 50
... и так далее.Я собрал Python-скрипт, чтобы определить наилучшее доступное число бит до 32, для смеха, и получил такой результат:
2^13 - 26 * 315 = 2
2^14 - 26 * 630 = 4
Так что в любом случае, у вас есть шанс 1 в 2 ^ 12перезапуск, если вы используете 13 или 14 бит.Ваш алгоритм в этом случае будет:
def random_character():
r = 8190
while r >= 8190:
r = rand(13) # assuming rand generates an N bit integer
return chr(r % 26 + ord('a'))
РЕДАКТИРОВАТЬ: Из любопытства я сравнил эти шансы с несколькими важными значениями, чтобы увидеть, действительно ли 13 было оптимальным числом (при условии, что вы можете сгенерировать любоебиты, от 1 до 32, в одно и то же время - если вы не можете, 13 бит выглядит лучше).Исходя из моей (по-видимому, сонной) математики, если вы можете получить 32 бита дешевле, чем 16, сделайте это вместо этого.В противном случае сделайте ставку в пользу 13.
2^8 through 2^12: by definition, no better than 1/2^12 odds
2^16: diff is 16, so 1/2^11
2^17: diff is 6, so slightly under 1/2^14
2^18: diff is 12, so slightly under 1/2^12
2^19: diff is 24, so slightly under 1/2^14
2^20: diff is 22, so slightly under 1/2^15
2^21: diff is 18, so slightly under 1/2^16
2^22: diff is 10, so slightly under 1/2^18
2^23: diff is 20, so slightly under 1/2^18
2^24: diff is 14, so slightly under 1/2^20
2^25: diff is 2, so 1/2^24
2^26: diff is 4, so 1/2^24
2^27: diff is 8, so 1/2^24
2^28: diff is 16, so 1/2^24
2^29: diff is 6, so slightly under 1/2^26
2^30: diff is 12, so slightly under 1/2^26
2^31: diff is 24, so slightly under 1/2^26
2^32: diff is 22, so slightly under 1/2^27