如何使用随机位来模拟公平的26面模具?

Mic*_*vin 5 random probability

如何使用随机数生成器给出位(0或1)来模拟公平的26面模具?我想使用比特流来挑选英文字母的字母,这样任何一个字母出现的几率与任何其他字母的几率相同(我知道真实的单词不是那样的,并且每个字母都有特定的频率分布)信,但这里没关系).使用二进制0/1决策从集合AZ中公平选取字母的最佳方法是什么?我可以想出几种方法将位映射到字母上,但对我来说并不是很明显它们不会有偏见.有一种已知的好方法吗?

Mar*_*ers 7

如果你将自己局限于有限数量的位并且你的骰子有26个边,则该方法将始终存在偏差.您必须允许您必须查看可能无限数量的位以确保它是无偏的.

一个简单的算法是选择0和下一个最大数字形式之间的随机数2^n - 1(在这种情况下为31).如果您随机选择的数字太大,请将其丢弃并重新输入,直到您获得范围内的数字.

很明显,这不是一种最佳算法,因为你"浪费"了一些信息,但对于大多数用途来说它应该足够好了.如果模具的侧面数量刚好超过2^m一些m,例如:33个侧面,则最浪费.在这种情况下,您将不得不在几乎50%的时间内丢弃该值.

  • 正确答案.我想补充一点,即对于十进制等效值大于26的任何五位,你可以保留最低有效位,只丢弃四个MSB,并再生四个随机位.这样可以节省一点,同时保持均匀分布. (2认同)

leo*_*loy 1

对于您的情况,最简单的方法是抛出 5 位,这会给出 32 (0-31) 个等概率结果。如果您得到的值超出了您的范围(大于 25),您将重试(并再次...)

在这种情况下,每个字母的平均“硬币”(比特)数是

 5 x 32 / 26  = 6.15
Run Code Online (Sandbox Code Playgroud)

(参考请参见几何分布