【问题标题】:Calculating the expected probability that an expression resolves to True计算表达式解析为 True 的预期概率
【发布时间】:2014-01-13 08:13:38
【问题描述】:

假设我有一个简单的程序来模拟抛硬币,给定的概率由表达式指定。它可能看起来像这样:

# This is the probability that you will get heads.
$expr = "rand < 0.5"

def get_result(expr)
   eval(expr)
end

def toss_coin
  if get_result($expr)
     return "Head"
  else
     return "Tail"
  end
end

现在,我还要告诉用户得到Head的概率是多少。

对于给定的表达式

"rand < 0.5"

我们可以目不转睛地说概率是 50%,因为 rand 返回一个介于 0 和 1 之间的数字,因此表达式的计算结果平均有 50% 的时间为真。

但是,如果我决定提供一个被操纵的硬币投掷,用于确定结果的表达式是

"rand < 0.3"

现在,我有 30% 的机会获得Head

是否可以编写一个方法来接受任意表达式(计算结果为布尔值!)并返回它解析为true的概率?

def get_expected_probability(expr)
  # Returns the probability the `expr` returns true
  #    `rand < 0.5` would return 0.5
  #    `rand < 0.3` would return 0.3
  #    `true` would return 1
  #    `false` would return 0
end

【问题讨论】:

  • 如果是家庭作业,也许是哲学 101。
  • 假设(使用require 'time')我们有t = Time.new.year == 2014; sleep(rand(5)); t。每当执行此操作时,它返回 true 的概率为零或一。今天,我们可以说真实的概率是 1.0。但是,当我们准备好在 2015 年响起时呢? get_expected_probability 可能不知道这是在旧年还是新年执行。要返回 0.0 到 1.0 之间的概率,我们需要扩展模型以表示代码在 2014 年执行的概率,这个概念可以说是没有意义的。所以,我认为答案是否定的。

标签: ruby probability


【解决方案1】:

我的猜测是理论上可以编写这样的方法,假设您将自己限制在 rand 和确定性数学函数并且完全了解系统浮点实现等.

然而,通过多次执行表达式并跟踪其成功次数的百分比来近似概率会更直接。

【讨论】:

    【解决方案2】:

    对于与统一随机数的简单比较,可以,但一般来说,不可以。这取决于您用来确定布尔值的表达式的分布,并且您可以编写具有奇异分布的任意复杂表达式。但是,根据经验估计概率非常简单。

    根据表达式创建伯努利 (0/1) 结果,当表达式为真时产生 1,当表达式为假时产生 0。生成大量(n)个。伯努利结果的长期平均值将收敛于得到正确结果的概率。如果您称其为 p-hat 并且真实值为 p,那么 p-hat 应在 95% 的时间范围内 p +/- (1.96 * sqrt(p*(1-p)/n))。从中可以看出,样本量 n 越大,您的估计就越精确。

    【讨论】:

      【解决方案3】:

      一种非常缓慢的近似方法是多次评估表达式并估计它收敛到的概率。 Law of Large Numbers 保证当 n 接近无穷大时,它就是那个概率。

      $expr = "rand < 0.5"
      
      def get_result(expr)
        eval(expr)
      end
      
      n = 1000000
      a = Array.new(n)
      
      n.times do |i|
        a[i] = eval($expr)
      end
      
      puts a.count(true)/n.to_f
      

      为我返回0.499899

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2014-07-22
        • 2021-05-31
        • 1970-01-01
        相关资源
        最近更新 更多