Могу ли я иметь несколько независимых генераторов случайных чисел в R, как я могу в C ++?

У меня есть много независимых случайных процессов (например, процессов прибытия), которые требуют от меня генерировать случайные числа. Я хочу использовать общие случайные числа для каждого из этих процессов, чтобы я мог сравнить, как разные политики работают при управлении этими политиками.

Я хочу, чтобы процесс A регулировался генератором A (используя начальное число A)
Я хочу, чтобы процесс B регулировался генератором B (используя начальное число B)
..

и так далее.

Можно ли это реализовать в R. Я не могу найти никого, кто это сделал. Я пытался. Простите, если это повторный вопрос.

Спасибо

Jak

5

Решение

Это то, что я иногда хотел сделать — и еще не придумал ничего лучше, чем следующий kludge (который действительно очень полезен, если вы используете только 1 или 2 разных случайных распределения, как вы должны написать функция для каждого:

#Make a list of seeds - generalises to mkore than 2
seed <- list(NA,NA)
set.seed(1)
seed[[1]] <- .Random.seed
set.seed(2)
seed[[2]] <- .Random.seed

my_runif <- function(...,which.seed=1)
{
.Random.seed <<- seed[[which.seed]]
x <-runif(...)
seed[[which.seed]] <<- .Random.seed
x
}

##Print some data for comparison
> set.seed(1); runif(10)
[1] 0.26550866 0.37212390 0.57285336 0.90820779 0.20168193 0.89838968 0.94467527 0.66079779 0.629114040.06178627
> set.seed(2); runif(10)
[1] 0.1848823 0.7023740 0.5733263 0.1680519 0.9438393 0.9434750 0.1291590 0.8334488 0.4680185 0.5499837

#Test
> my_runif(1,which.seed=1)
[1] 0.2655087
> my_runif(1,which.seed=1)
[1] 0.3721239
> my_runif(1,which.seed=1)
[1] 0.5728534
> my_runif(1,which.seed=2)
[1] 0.1848823
> my_runif(1,which.seed=1)
[1] 0.9082078

Я полагаю, что <<- сломается, если вы вызовете my_runif из другой функции.

fortunes::fortune("<<-")

ETA:
Следующее может быть более надежным

my_runif <- function(...,which.seed=1)
{
assign(".Random.seed", seed[[which.seed]], envir = .GlobalEnv)
x <-runif(...)
seed <- seed #Bring into local envir
seed[[which.seed]] <- .Random.seed
assign("seed", seed, envir = .GlobalEnv)
x
}
4

Другие решения

Ну, хорошие новости что вы уже делаете — увидеть help(RNGkind):

 The currently available RNG kinds are given below.  ‘kind’ is
partially matched to this list.  The default is
‘"Mersenne-Twister"’.

‘"Wichmann-Hill"’ [...]

‘"Marsaglia-Multicarry"’: [...]

‘"Super-Duper"’: [...]

‘"Mersenne-Twister"’: [...]

‘"Knuth-TAOCP-2002"’: [...]

‘"Knuth-TAOCP"’: [...]

‘"L'Ecuyer-CMRG"’:

‘"user-supplied"’: Use a user-supplied generator.  See
‘Random.user’ for details.

а также user-supplied позволяет вам использовать свой собственный.

А для N (0,1) у вас также есть

 ‘normal.kind’ can be ‘"Kinderman-Ramage"’, ‘"Buggy
Kinderman-Ramage"’ (not for ‘set.seed’), ‘"Ahrens-Dieter"’,
‘"Box-Muller"’, ‘"Inversion"’ (the default), or ‘"user-supplied"’.
(For inversion, see the reference in ‘qnorm’.)  [...]

Для параллельной работы см. (Отличную) виньетку parallel пакет, поставляемый с R. Существуют генераторы для нескольких потоков / ядер / … и т. д.

Наконец, что не менее важно, R, конечно, расширяемый, и вы можете, например, использовать Rcpp, где мы
есть несколько постов на случайные числа на сайте галереи Rcpp.

3

По вопросам рекламы [email protected]