我想在R中使用Von-Neuman中间平方方法生成随机数 我的代码返回了平方值。
midSquareRand <- function(seed, len) {
randvector <- NULL
for(i in 1:len) {
value <- seed * seed
Y=as.numeric(unlist(strsplit(as.character(value),split="")))
P=Y[3:6]
seed=as.numeric(paste(P,collapse= ""))
randvector <- c(randvector,seed)
}
return(randvector)
}
R = midSquareRand(6752, 50)
答案 0 :(得分:0)
首先,请注意,Von-Neuman中间平方方法并不是一个很好的PRNG。
一个问题是,在生成的序列中,位数可能少于2n,根据wikipedia page,过程是填充前导零:
要生成一个n位伪随机数序列,将创建一个n位起始值并将其平方,从而生成2n位数字。如果结果少于2n位,则添加前导零以进行补偿。
要实现这一点,假设n = 4,我们可以添加一行
Y = c(rep(0,8 - length(Y)), Y)
此外,中间部分最终可能为零,因此将生成确定性的零序列。
midSquareRand <- function(seed, len) {
randvector <- NULL
for(i in 1:len) {
value <- seed * seed
Y=as.numeric(unlist(strsplit(as.character(value),split="")))
Y = c(rep(0,8 - length(Y)), Y)
P=Y[3:6]
seed=as.numeric(paste(P,collapse= ""))
randvector <- c(randvector,seed)
}
return(randvector)
}
R=midSquareRand(6752, 50)
给我
[1] 5895 7510 4001 80 64 40 16 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[23] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[45] 0 0 0 0 0 0