Generieren Sie Zufallszahlen mit logarithmischer Verteilung und benutzerdefinierter Steigung

8

Ich versuche, zufällige ganze Zahlen mit logarithmischer Verteilung zu erzeugen. Ich benutze die folgende Formel:

%Vor%

Dies funktioniert gut und erzeugt eine Sequenz wie diese für 1000 Iterationen (jede Zahl gibt an, wie oft dieser Index erzeugt wurde):

%Vor%

Geige

Ich versuche nun, die Steigung dieser Verteilung so anzupassen, dass sie nicht so schnell abfällt und etwas wie folgt erzeugt:

%Vor%

Blind mit Koeffizienten zu spielen gab mir nicht, was ich wollte. Irgendwelche Ideen, wie man es erreicht?

    
serg 08.06.2015, 22:24
quelle

1 Antwort

4

Sie erwähnen eine logarithmische Verteilung, aber es sieht so aus, als ob Ihr Code eine abgestumpfte geometrische Verteilung erzeugt, obwohl er fehlerhaft ist. Es gibt mehr als eine Verteilung, die als logarithmische Verteilung bezeichnet wird, und keine davon ist so verbreitet. Bitte klären Sie, ob Sie wirklich eine von ihnen meinen.

Sie berechnen floor [log_2 U] wobei U gleichmäßig von 1 bis (2 ^ max) +1 verteilt ist. Dies hat eine maximale Chance von 1/2 ^ max zu erzeugen, aber Sie klemmen das auf max-1. Also, Sie haben eine 1/2 ^ maximale Chance, 0, 2/2 ^ maximale Chance zu produzieren, 1, 4/2 ^ maximale Chance, 2 zu erzeugen, ... bis zu einem 1/2 + 1/2 ^ max Chance, max-1 zu produzieren.

In Ihrem Code vorhanden, aber in der Beschreibung in der Frage fehlt, ist, dass Sie den berechneten Index mit

umdrehen %Vor%

Danach ist Ihre Chance, 0 zu produzieren, 1/2 + 1/2 ^ max, und Ihre Chance, einen Wert von k zu erzeugen, ist 1/2 ^ (k + 1).

Ich denke, es ist ein Fehler, U einheitlich auf [1,2 ^ max + 1] zu haben. Stattdessen denke ich, dass Sie möchten, dass U auf [1,2 ^ max] einheitlich ist. Dann ist Ihre Chance, idx = k zu erzeugen, 2 ^ (max-k-1) / ((2 ^ max) -1).

%Vor%

zmiis Kommentar, dass Sie eine flachere Verteilung erhalten könnten, indem Sie beide 2.0s durch einen Wert näher an 1.0 ersetzen, ist gut. Der Grund, warum es für kleine Werte von max zu unbefriedigenden Ergebnissen führte, war, dass Sie gleichmäßig von [1,1,3 ^ max + 1] anstelle von [1,1,3 ^ max] abtasteten. Das Extra +1 machte einen größeren Unterschied, wenn max kleiner und die Basis kleiner war. Versuchen Sie Folgendes:

%Vor%     
Douglas Zare 09.06.2015, 06:37
quelle