假设您有一枚硬币,并且您希望以相同的概率随机选择3个数字(或更多)。如果你只是为每一对掷硬币,那么你给第一轮的幸存者两个失去的机会,并且分配不均匀。
一般来说,你有一个函数Random(0,1),它返回0,概率为0.5,概率为0.5。使用此函数,使Random(a,b)以相等的概率返回[a,b]范围内的任何整数。
有什么想法吗?
答案 0 :(得分:0)
给定Random(0,1),生成Random(0,3)更容易。随机(0,3)可以通过两个连续的硬币投掷来模拟生成四个桶:00,01,10,11。
一般来说,随机(0,2 ^ n-1)很容易生成给定的随机(0,1)[即一个公平的硬币]。任何其他随机(0,n)将难以生成,而不是真正“随机” - 因为您必须预先确定您想要认为属于“其他”存储桶的结果数量。
你可以几乎伪造 Random(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