具有N个头部概率的硬币鳍状肢

时间:2016-09-20 04:25:35

标签: ruby

目标是翻转加权硬币,使其在N%的时间内返回头部。

我并不是完全难过。我可以这样做:

probability = 0.75 # chance of getting heads as decimal
num_heads_cases = (100.to_f * probability).to_i
cases = num_heads_cases.times.map { :heads }.concat(
  (100 - num_heads_cases).times.map { :tails }
)
is_flip_result_heads = cases.sample == :heads

但是我在这里发帖,看看是否有一些核心红宝石/铁轨方法我不能忽视。我正在寻找类似于以下方法签名的东西:

def random_bool(probability_of_returning_true=0.5)

这类似于被标记为重复但不重复的问题;那个问题要求如何获得一个随机数,而这个问题要求如何获得一个概率为的随机布尔值。

如何从"随机数" to" random boolean"但显然不是每个人都这样。

2 个答案:

答案 0 :(得分:3)

def rb(prob=0.5)
  rand < prob
end

10.times.map { rb(0.8) }
  #=> [true, true, false, false, true, false, true, true, true, true]

100.times.reduce(0) { |t,_| t + (rb(0.8) ? 1 : 0) }/100.0
  #=> 0.87

1000.times.reduce(0) { |t,_| t + (rb(0.8) ? 1 : 0) }/1000.0
  #=> 0.798 

10000.times.reduce(0) { |t,_| t + (rb(0.8) ? 1 : 0) }/10000.0
  #=> 0.8003

答案 1 :(得分:1)

# prob : Probability (Float between 0 and 1)
def flip_weighted_coin(prob)
  (rand < prob) ? :heads : :tails
end