我正在寻找一个以给定概率返回TRUE
的函数。类似的东西:
> proba = 2/3
> function(proba)
它以2/3的概率返回TRUE
(或1),并返回FALSE
(或0),概率为1/3
我能想到的唯一计算方法是:
> sample(c(rep(1,ceiling(proba*100)),rep(0,ceiling((1-proba)*100))),1)
但它只给出一个近似值(并且它看起来并不好看!),因为它只能处理具有有限小数位数的值。
答案 0 :(得分:4)
proba <- 2/3
# number of values:
n <- 1
as.logical(rbinom(n,size=1,prob=proba))
答案 1 :(得分:3)
prob <- runif(1)>0.3333333
会为你做的。或者在一般情况下,
prob <-function(winval) runif(1)>(1-winval)
答案 2 :(得分:3)
怎么样:
function(proba) sample(c(TRUE, FALSE), 1, prob = c(proba, 1 - proba))
如果您希望能够绘制任意数量的TRUE / FALSE,而不仅仅是一个:
function(proba, size) sample(c(TRUE, FALSE), size, prob = c(proba, 1 - proba),
replace = TRUE)
答案 3 :(得分:0)
仅供参考,您可以通过创建总人口然后执行选择来避免对概率的分数表示的怀疑,如下所示:
sample(c(rep(TRUE, 2), rep(FALSE, 1)), 1)
OR
sample(c(TRUE, TRUE, FALSE), 1)
通常,我们使用概率来表示未知或可行的不可数大小的群体的选择可能性。概率用作代理。当您了解人口的详细信息时,从数学角度来看,实际上首选使用精确人口。它还具有更准确地表示这一特定问题的副作用。
要扩展解决方案,您需要将概率转换为每个人口子集的总体总数。在这种情况下,我们有两个子集:TRUE和FALSE。您不是将TRUE个体的选择可能性表示为2/3,而是表示总人口中包含的真实个体数量TRUE_N,以及总人口中包含的FALSE个体数量FALSE_N。
TRUE_N <- 2
FALSE_N <- 1
sample(c(rep(TRUE, TRUE_N), rep(FALSE, FALSE_N)), 1)