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

R语言嵌套循环生成不同概率几何分布随机变量的问题

解决几何分布随机变量遍历概率生成的问题

你的问题出在内层循环的赋值逻辑上——每次切换概率时,你都把x和y的前10000个位置重新覆盖了一遍,最后自然只剩下最后一个概率的结果啦。下面给你两种高效的修正方案:

方案一:预分配向量(推荐,效率更高)

因为我们知道总样本数是概率个数 × 10000,可以提前分配好向量空间,然后按批次填充数据,而且完全不需要内层循环——rgeom本身就支持一次性生成n个随机变量:

probs <- seq(0.1, 0.9, 0.1)
sample_per_prob <- 10000
total_samples <- length(probs) * sample_per_prob

# 预分配整数/数值向量,避免动态扩容的性能损耗
x <- integer(total_samples)
y <- numeric(total_samples)

for (i in seq_along(probs)) {
  # 计算当前概率对应的样本在向量中的起止位置
  start_pos <- (i - 1) * sample_per_prob + 1
  end_pos <- i * sample_per_prob
  
  # 一次性生成10000个样本,填充到对应区间
  x[start_pos:end_pos] <- rgeom(n = sample_per_prob, prob = probs[i]) + 1
  # 重复当前概率10000次,填充到y的对应区间
  y[start_pos:end_pos] <- probs[i]
}

方案二:用列表分组收集再合并

如果需要保留每个概率对应的样本组(方便后续单独分析),可以先把每个概率的样本存到列表里,最后再合并成向量:

probs <- seq(0.1, 0.9, 0.1)
sample_per_prob <- 10000

x_list <- list()
y_list <- list()

for (i in seq_along(probs)) {
  # 为每个概率生成10000个样本,存入列表的对应位置
  x_list[[i]] <- rgeom(n = sample_per_prob, prob = probs[i]) + 1
  # 生成对应长度的概率重复值
  y_list[[i]] <- rep(probs[i], sample_per_prob)
}

# 把列表合并成单一向量
x <- unlist(x_list)
y <- unlist(y_list)

为什么原来的代码会失效?

你原来的内层循环for (j in 1:10000)每次都会从第1个位置开始覆盖x[j]和y[j]:比如当i=1(概率0.1)时,x[1]到x[10000]存的是0.1对应的样本;但当i=2(概率0.2)时,又会把x[1]到x[10000]全部替换成0.2的样本,以此类推,最后只有最后一个概率(0.9)的样本被保留下来。

另外提个小建议:用seq_along(probs)代替1:length(probs)更安全——如果probs意外为空,1:length(probs)会生成c(1,0)导致循环出错,而seq_along会返回空向量,避免不必要的bug。

内容的提问来源于stack exchange,提问作者Constantin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:47:47