Manchmal möchte ich eine randomisierte Funktion schreiben, die immer die gleiche Ausgabe für eine bestimmte Eingabe zurückgibt. Ich habe das immer implementiert, indem ich den Random-Seed am Anfang der Funktion gesetzt habe und dann fortgefahren bin. Betrachten wir zwei auf diese Weise definierten Funktionen:Making Funktionen, die die Zufalls-Seed unabhängig einstellen
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
liefert einen Vektor mit der angegebenen Größe zufällig aus dem Satz abgetastete {1, 2}
und rand.prod
multipliziert jedes Element eines bestimmten Vektors durch einen Zufallswert gleichmäßig von [0, 1]
ausgewählt. Normalerweise würde ich x <- sample.12(10000) ; rand.prod(x)
erwarte eine „Schritt“ Verteilung mit pdf 3/4 im Bereich [0, 1]
und 1/4 im Bereich habe [1, 2]
, aber aufgrund meiner unglücklichen Wahl von identischen zufälligen Samen oben sehe ich ein anderes Ergebnis:
x <- sample.12(10000)
hist(rand.prod(x))
ich kann dieses Problem beheben in diesem Fall durch das zufällige Saatgut in einer der Funktionen auf einen anderen Wert zu ändern. Zum Beispiel mit set.seed(10000)
in rand.prod
bekomme ich die erwartete Verteilung:
Previously on SO diese Lösung verschiedener Samen verwendet wird als der beste Ansatz angenommen worden zu erzeugen unabhängige Zufallszahlenströme. Allerdings finde ich die Lösung unbefriedigend, da Streams mit unterschiedlichen Seeds miteinander verwandt sein könnten (möglicherweise sogar highly related to one another); in der Tat könnten sie sogar identische Ströme ergeben nach ?set.seed
:
Es gibt keine Garantie dafür, dass unterschiedliche Werte von Samen unterschiedlich die RNG Saatgut wird, obwohl Ausnahmen extrem selten sein würde.
Gibt es eine Möglichkeit, ein Paar von randomisierten Funktionen in R zu implementieren, dass:
- immer die gleiche Leistung für einen bestimmten Eingang zurück und
- Erzwingen Unabhängigkeit zwischen den Quellen der Zufälligkeit durch mehr als nur verschiedene zufällige Samen zu verwenden?
Toller Fund. Aus Gründen der Vollständigkeit verwendet 'rlecuyer'' MRG32k3a' (Kapitel 1.1 von [dieses Papier] (http://www.iro.umontreal.ca/~lecuyer/myftp/papers/streams00.pdf)), so kann es sein ebenso wie seine Grenzen (genau wie Mersenne-Twister). Sollte in 99% Fällen jedoch kein großes Problem sein. – tonytonov