【问题标题】:coin flipper with N probability of heads正面朝上的概率为 N 的抛硬币机
【发布时间】:2016-09-20 04:25:34
【问题描述】:

目标是掷一枚加权硬币,使其有 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

但我在这里发帖是为了看看是否有一些我忽略的核心 ruby​​ / rails 方法。我正在寻找类似于以下方法签名的东西:

def random_bool(probability_of_returning_true=0.5)

这类似于它被标记为重复但不是重复的问题;该问题询问如何获得随机数,而这个问题询问如何获得具有概率的随机布尔值

如何从“随机数”变为“随机布尔值”似乎很明显,但显然不是每个人都这样。

【问题讨论】:

标签: ruby


【解决方案1】:
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

【讨论】:

    【解决方案2】:
    # prob : Probability (Float between 0 and 1)
    def flip_weighted_coin(prob)
      (rand < prob) ? :heads : :tails
    end
    

    【讨论】:

      猜你喜欢
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 2017-06-23
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多