Angenommen, ich möchte aus dem Intervall eine Reihe von Zufallszahlen generieren (a, b)
. Die generierte Sequenz sollte auch die Eigenschaft haben, dass sie sortiert ist. Ich kann mir zwei Möglichkeiten vorstellen, um dies zu erreichen.
Sei n
die Länge der zu erzeugenden Sequenz.
1. Algorithmus:
Let `offset = floor((b - a) / n)`
for i = 1 up to n:
generate a random number r_i from (a, a+offset)
a = a + offset
add r_i to the sequence r
2. Algorithmus:
for i = 1 up to n:
generate a random number s_i from (a, b)
add s_i to the sequence s
sort(r)
Meine Frage ist, erzeugt Algorithmus 1 Sequenzen, die so gut sind wie die von Algorithmus 2 erzeugten?
random-generation
Ultrajohn
quelle
quelle
R
. Um ein Array von Mengen von n Zufallszahlen über ein einheitliches Intervall [ a , b ] zu erzeugen, funktioniert der folgende Code : .rand_array <- replicate(k, sort(runif(n, a, b))
Antworten:
Der erste Algorithmus schlägt aus zwei Gründen schlecht fehl :
Wenn Sie den Boden von kann dies drastisch reduziert werden. In der Tat, wenn b - a < n ist , ist es Null, was Ihnen eine Menge gibt, deren Werte alle gleich sind!( a - b ) / n b - a < n
Wenn Sie nicht das Wort ergreifen, sind die resultierenden Werte zu gleichmäßig verteilt. Zum Beispiel gibt es in jeder einfachen Zufallsstichprobe von iid einheitlichen Variablen (etwa zwischen a = 0 und b = 1 ) eine ( 1 - 1 / n ) n ≈ 1 / e ≈ 37 % Wahrscheinlichkeit, dass die größte nicht sein wird im oberen Intervall von 1 - 1 / n bis 1 . Mit Algorithmus 1 gibt es eine 100n a = 0 b = 1 ( 1 - 1 / n )n≈ 1 / e ≈ 37 % 1 - 1 / n 1 100 % Chance, dass das Maximum in diesem Intervall liegt. Für einige Zwecke ist diese Supergleichmäßigkeit gut, aber im Allgemeinen ist es ein schrecklicher Fehler, weil (a) viele Statistiken ruiniert werden, aber (b) es sehr schwierig sein kann, festzustellen, warum.
Wenn Sie das Sortieren vermeiden möchten, generieren Sie stattdessen unabhängige exponentiell verteilte Variablen. Normalisieren Sie ihre kumulative Summe auf den Bereich ( 0 , 1 ), indem Sie durch die Summe dividieren. Löschen Sie den größten Wert (der immer 1 sein wird ). Skalieren Sie auf den Bereich ( a , b ) .n + 1 ( 0 , 1 ) 1 ( a , b )
Histogramme aller drei Algorithmen werden angezeigt. (Jedes zeigt die kumulativen Ergebnisse von unabhängigen Sätzen mit jeweils n = 100 Werten.) Das Fehlen einer sichtbaren Variation im Histogramm für Algorithmus 1 zeigt das Problem dort. Die Variation der beiden anderen Algorithmen ist genau das, was zu erwarten ist - und was Sie1000 n = 100 von einem Zufallszahlengenerator benötigen .
Weitere (amüsante) Möglichkeiten zum Simulieren unabhängiger gleichmäßiger Variablen finden Sie unter Simulieren von Zeichnungen aus einer gleichmäßigen Verteilung mithilfe von Zeichnungen aus einer Normalverteilung .
Hier ist der
R
Code, der die Figur erzeugt hat.quelle
Der erste Algorithmus erzeugt zu gleichmäßig verteilte Zahlen
Siehe auch Reihen mit geringer Diskrepanz .
(Wie bereits ausgeführt, ist dies eine gewünschte Eigenschaft zB für Schichtung sein kann. Low-Diskrepanz Serien wie Halton und Sobel haben ihre Fälle verwenden.)
Ein richtiger, aber teurer Ansatz (für echte Werte)
... soll Beta-verteilte Zufallszahlen verwenden. Die Rangordnungsstatistik der Gleichverteilung ist Beta-verteilt. Sie können dies verwenden, um zufällig die kleinste , dann die zweitkleinste, ... Wiederholung zu zeichnen .
Was den folgenden Algorithmus ergibt:
Es kann numerische Instabilitäten geben, und das Berechnen
pow
und Teilen für jedes Objekt kann sich als langsamer als das Sortieren herausstellen.Für ganzzahlige Werte müssen Sie möglicherweise eine andere Verteilung verwenden.
Das Sortieren ist unglaublich billig, verwenden Sie es also einfach
quelle
Es hängt auch davon ab, was Sie mit den Zufallszahlen machen. Bei numerischen Integrationsproblemen würde Methode 1 (wenn sie durch Entfernen des Bodenoperators korrigiert wird) eine überlegene Punktmenge erzeugen. Was Sie tun, ist eine Form der geschichteten Probenahme und hat den Vorteil, dass Verklumpungen vermieden werden. Es ist beispielsweise unmöglich, alle Ihre Werte im Bereich von 0- (ba) / n zu erhalten. Für andere Anwendungen kann dies jedoch sehr schlecht sein. Dies hängt davon ab, was Sie damit tun möchten.
quelle