Во-первых, обратите внимание, что метод средних квадратов фон Неймана не очень хороший PRNG.
Одна проблема заключается в том, что в генерируемой последовательности может быть менее 2n цифр. Согласно странице википедии процедура заключается в заполнении нулей:
Чтобы сгенерировать последовательность из n-значных псевдослучайных чисел, начальное значение из n-цифр создается и возводится в квадрат, в результате получается 2-значное число.Если результат содержит менее 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