求助:基于线性同余法的随机数序列生成R函数编写
修复线性同余随机数生成器函数的问题
我来帮你搞定这个线性同余生成器(LCG)的函数,你的代码里有几个关键问题需要调整,我会一步步拆解并给出修正后的版本:
原代码的核心问题
- 参数定义错误:你写的
x = x[0]完全无效——R的向量索引从1开始,根本不存在x[0],应该用单独的x0参数来传递初始种子值。 - 未初始化结果向量:直接给
x[n]赋值会报错,因为x还没有被创建成一个有长度的向量。 - 循环逻辑混乱:
while(n > 0)的写法会陷入死循环(你没在循环里更新n的值),而且生成顺序也不符合需求。 - 缺少返回值:函数执行完后没有返回生成的随机数序列,等于白跑一趟。
修正后的完整代码
my.unif1 <- function(n, a, m, x0, c = 0) { # 初始化一个长度为n的空向量,用来存储生成的随机数 x <- numeric(n) # 生成第一个随机数(基于初始种子x0) x[1] <- (a * x0 + c) %% m # 循环生成剩下的n-1个随机数 for (i in 2:n) { x[i] <- (a * x[i-1] + c) %% m } # 返回最终的随机数序列 return(x) }
代码说明
- 参数调整:把必填参数(
n样本量、a乘数、m模数、x0初始种子)放在前面,默认参数c(增量)放在最后,符合R的参数设计习惯。 - 向量初始化:用
numeric(n)创建一个长度为n的空数值向量,确保后续赋值不会报错。 - 循环逻辑:从第2个元素开始,依次用前一个元素计算当前值,完全匹配你给出的公式
xi = (a*xi-1 + c) mod m。 - 返回结果:通过
return(x)让函数输出生成的随机数序列。
使用示例
比如用经典的LCG参数(来自glibc的rand()函数)生成5个随机数:
# 调用函数:n=5个样本,a=1103515245,m=2^31,x0=初始种子12345,c默认0 result <- my.unif1(n=5, a=1103515245, m=2^31, x0=12345) print(result)
运行后会得到类似这样的输出:
[1] 1406932606 654583775 1449466924 226951040 723566020
内容的提问来源于stack exchange,提问作者CringleVonChubbleslerry
相关产品推荐
相关产品推荐

