如何使用中平方方法生成随机数?

时间:2019-02-20 06:13:27

标签: r

我想在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)

1 个答案:

答案 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