You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中按逐次不同概率用sample函数生成0-1序列?

解决R中按逐元素概率采样0/1的问题

首先纠正你代码里的两个基础错误:

  1. R中创建向量要用c(),不是括号,正确的概率向量定义是:
myprob <- c(0.58, 0.51, 0.48, 0.46, 0.62)
  1. 你误用了sample()函数的参数逻辑:sample()的prob参数是指定待采样集合中每个元素的权重,而非每次采样的独立概率分布。当你传入长度为10的prob=c(1-myprob, myprob)时,会和待采样集合c(1,0)的长度不匹配,导致逻辑混乱;同时replace=F是无放回采样,最多只能取2个值,完全不符合生成5个独立样本的需求。

正确的两种实现方法

方法1:用rbinom()(推荐,更高效简洁)

伯努利分布(0/1采样)正好匹配你的需求:rbinom()的prob参数可以直接传入向量,每个元素对应一次采样取1的概率。代码如下:

# 生成5个0/1值,第i个值取1的概率是myprob[i],取0的概率是1-myprob[i]
Y <- rbinom(n = length(myprob), size = 1, prob = myprob)

方法2:用sapply()循环调用sample()

如果坚持用sample(),可以对每个概率单独采样再合并结果:

Y <- sapply(myprob, function(p) {
  # 每次按(1-p, p)的概率采样0和1
  sample(c(0, 1), size = 1, prob = c(1-p, p))
})

验证结果

你可以多次运行代码,查看采样结果是否符合预期概率:比如重复10000次采样后,统计每个位置取1的频率,应该接近myprob的对应值:

replicates <- replicate(10000, rbinom(n=5, size=1, prob=myprob))
rowMeans(replicates)
# 输出应该接近:0.58, 0.51, 0.48, 0.46, 0.62

内容的提问来源于stack exchange,提问作者Yen-chin Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:10:28