Ruby 计算表达式解析为True的预期概率

Ruby 计算表达式解析为True的预期概率,ruby,probability,Ruby,Probability,假设我有一个简单的程序,模拟抛硬币,用一个表达式指定给定的概率。它可能看起来像这样: # 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

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

# 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
我们可以用眼球观察它,说概率是50%,因为rand返回一个介于0和1之间的数字,因此表达式平均有50%的时间计算为真

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

"rand < 0.3"
我的猜测是,假设您仅限于
rand
和确定性数学函数,并且完全了解系统浮点实现等,那么从理论上讲,编写这样一种方法是可能的

但是,通过多次执行表达式并跟踪其成功的次数百分比来近似概率要简单得多。

我的猜测是,从理论上讲,编写这样一种方法是可能的,假设您仅限于
rand
和确定性数学函数,并且对系统浮点实现等有完整的了解

但是,通过多次执行表达式并跟踪其成功的次数百分比来近似概率要简单得多。

我的猜测是,从理论上讲,编写这样一种方法是可能的,假设您仅限于
rand
和确定性数学函数,并且对系统浮点实现等有完整的了解

但是,通过多次执行表达式并跟踪其成功的次数百分比来近似概率要简单得多。

我的猜测是,从理论上讲,编写这样一种方法是可能的,假设您仅限于
rand
和确定性数学函数,并且对系统浮点实现等有完整的了解


但是,通过多次执行表达式并跟踪其成功的次数百分比来近似概率要简单得多。

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


基于表达式创建一个伯努利(0/1)结果,表达式为真时产生1,表达式为假时产生0。生成大量(n个)。伯努利结果的长期平均值将收敛到获得真实结果的概率。如果调用该p-hat,且真实值为p,则p-hat应在
p+/-(1.96*sqrt(p*(1-p)/n))
95%的时间范围内。从中可以看出,样本大小n越大,估计值越精确。

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


基于表达式创建一个伯努利(0/1)结果,表达式为真时产生1,表达式为假时产生0。生成大量(n个)。伯努利结果的长期平均值将收敛到获得真实结果的概率。如果调用该p-hat,且真实值为p,则p-hat应在
p+/-(1.96*sqrt(p*(1-p)/n))
95%的时间范围内。从中可以看出,样本大小n越大,估计值越精确。

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


基于表达式创建一个伯努利(0/1)结果,表达式为真时产生1,表达式为假时产生0。生成大量(n个)。伯努利结果的长期平均值将收敛到获得真实结果的概率。如果调用该p-hat,且真实值为p,则p-hat应在
p+/-(1.96*sqrt(p*(1-p)/n))
95%的时间范围内。从中可以看出,样本大小n越大,估计值越精确。

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


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

一种非常缓慢的近似方法是对表达式进行大量计算,并估计其收敛的概率。保证当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
$expr=“rand<0.5”
def get_r
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
$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