A volte desidero scrivere una funzione randomizzata che restituisca sempre lo stesso output per un input specifico. L'ho sempre implementato impostando il seme casuale all'inizio della funzione e procedendo. Considerare due funzioni definite in questo modo:Creazione di funzioni che impostano il seed independent indipendente
sample.12 <- function(size) {
set.seed(144)
sample(1:2, size, replace=TRUE)
}
rand.prod <- function(x) {
set.seed(144)
runif(length(x)) * x
}
sample.12
restituisce un vettore di dimensione specificata campionatura casuale dal set {1, 2}
e rand.prod
moltiplica ciascun elemento di un vettore specificato da un valore casuale uniformemente scelto tra [0, 1]
. Normalmente mi aspetterei una distribuzione "step" con pdf 3/4 nell'intervallo [0, 1]
e 1/4 nell'intervallo [1, 2]
, ma a causa della mia sfortunata scelta di semi casuali identici sopra vedo un risultato diverso:
x <- sample.12(10000)
hist(rand.prod(x))
posso risolvere questo problema in questo caso cambiando il seme casuale in una delle funzioni per qualche altro valore. Ad esempio, con set.seed(10000)
in rand.prod
ottengo la distribuzione previsto:
Previously on SO questa soluzione di utilizzare diversi semi è stato accettato come il metodo migliore per generare numeri casuali indipendenti flussi. Tuttavia, trovo che la soluzione sia insoddisfacente perché i flussi con semi diversi potrebbero essere correlati tra loro (forse anche highly related to one another); infatti, essi potrebbero anche producono flussi identici secondo ?set.seed
:
Non v'è alcuna garanzia che differenti valori di seme seme RNG diverso, anche se le eccezioni sarebbero estremamente raro.
C'è un modo per implementare una coppia di funzioni randomizzati in R che:
- Riportare sempre la stessa uscita per un particolare ingresso, e
- Imporre indipendenza tra loro fonti di casualità di più che usare solo semi casuali diversi?
Grande scoperta. Per completezza, 'rlecuyer' usa' MRG32k3a' (capitolo 1.1 di [questo articolo] (http://www.iro.umontreal.ca/~lecuyer/myftp/papers/streams00.pdf)), quindi può anche i suoi limiti (proprio come fa Mersenne-Twister). Non dovrebbe essere un grosso problema nel 99% dei casi. – tonytonov