【发布时间】:2013-10-13 04:09:29
【问题描述】:
假设您有一枚硬币,并且您想以相同的概率在 3 个(或更多)数字之间进行随机选择。如果你只是为每一对掷硬币,那么你给了第一轮的幸存者两次失败的机会,并且分布不均匀。
通常,您有一个函数 Random(0,1),它以 0.5 的概率返回 0,以 0.5 的概率返回 1。使用此函数,生成 Random(a,b),它以相等的概率返回 [a,b] 范围内的任何整数。
有什么想法吗?
【问题讨论】:
假设您有一枚硬币,并且您想以相同的概率在 3 个(或更多)数字之间进行随机选择。如果你只是为每一对掷硬币,那么你给了第一轮的幸存者两次失败的机会,并且分布不均匀。
通常,您有一个函数 Random(0,1),它以 0.5 的概率返回 0,以 0.5 的概率返回 1。使用此函数,生成 Random(a,b),它以相等的概率返回 [a,b] 范围内的任何整数。
有什么想法吗?
【问题讨论】:
在给定 Random(0, 1) 的情况下生成 Random(0,3) 更容易。 Random(0, 3) 可以通过连续两次抛硬币来模拟生成四个桶:00、01、10、11。
一般来说,给定 Random(0, 1) [即一枚公平的硬币]。任何其他 Random(0, n) 都将难以生成,并且不是真正的“随机”——因为您必须预先确定要考虑属于“其他”存储桶的结果数量。
你可以像这样几乎是假的随机(0,2)(类似 Ruby 的伪代码):
options = ['h', 't', 'n'] # heads, tails, neither
hash = {'h' => 0, 't' => 0, 'n' => 0} # number of 'heads', 'tails', 'neither'
rand = options[random(0, 1)]
rand = 'n' if (hash[rand] % 3 == 2) # every third 'h' or 't' is an 'n'
hash[rand] ++ # update buckets
同样,这不是“随机的”,因为每三个头部或尾部都被认为是“两者都不是”。
更新:请参阅相关问题以获得更优雅的答案。 Creating a random number generator from a coin toss
【讨论】: