Как генерировать случайные числа, используя метод среднего квадрата? - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу генерировать случайные числа, используя метод среднего квадрата фон Неймана в R. Но мой код возвращает возведенное в квадрат значение.

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 голосов
/ 20 февраля 2019

Во-первых, обратите внимание, что метод средних квадратов фон Неймана не очень хороший 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...