Ok, also hier ist mein Problem. Wir suchen den Erwerb eines Datensatzes von einem Unternehmen, um unseren bestehenden Datensatz zu erweitern. Für die Zwecke dieser Frage, lassen Sie uns sagen, dass dieser Datensatz Plätze mit einer organischen Zahl einreiht (was bedeutet, dass die einem Ort zugewiesene Nummer keinen Einfluss auf die einem anderen zugewiesene Nummer hat). Der technische Bereich ist 0 bis unendlich, aber von Sample-Sets, die ich gesehen habe, ist es 0 bis 70. Basierend auf der Probe ist es definitiv keine einheitliche Verteilung (von 10.000 gibt es vielleicht 5 Orte mit einer Punktzahl über 40, 50 mit einer Punktzahl über 10, und 1000 mit einer Punktzahl über 1). Bevor wir uns entscheiden, dieses Set zu kaufen, möchten wir es simulieren, damit wir sehen können, wie nützlich es ist.
Um es zu simulieren, habe ich überlegt, für jeden Ort eine Zufallszahl zu generieren (ungefähr 150.000 Zufallszahlen). Aber ich möchte auch den Geist der Daten beibehalten und die Verteilung relativ gleich (oder zumindest einigermaßen nahe) halten. Ich habe mir den ganzen Tag lang den Kopf zerbrochen und versucht, mir einen Weg zu überlegen, wie ich das machen könnte, und ich bin leer ausgegangen.
Ein Gedanke, den ich hatte, war, die Zufallszahl zu quadrieren (zwischen 0 und sqrt (70)). Aber das würde sowohl weniger als 1 als auch größere Zahlen bevorzugen.
Ich denke, dass die reale Verteilung im ersten Quadranten hyperbolisch sein sollte ... Ich blende nur aus, wie man eine lineare, gleichmäßige Verteilung von Zufallszahlen in eine hyperbolische Verteilung umwandelt (Wenn hyperbolisch ist, was ich will an erster Stelle).
Irgendwelche Gedanken?
Also, um es zusammenzufassen, hier ist die Verteilung, die ich (ungefähr) gerne hätte:
Sehen Sie sich Verteilungen an, die in der Zuverlässigkeitsanalyse verwendet werden - sie neigen dazu, diese langen Schwänze zu haben. Eine relativ einfache Möglichkeit ist die Weibull-Verteilung mit P (X & gt; x) = exp [- (x / b) ^ a].
Wenn Sie Ihre Werte als P (X & gt; 1) = 0,1 und P (X & gt; 10) = 0,005 anpassen, erhalten Sie a = 0,36 und b = 0,1. Dies würde bedeuten, dass P (X & gt; 40) · 10000 = 1,6, was etwas zu niedrig ist, aber P (X & gt; 70) · 10000 = 0,2, was vernünftig ist.
BEARBEITEN Oh, und um eine Weibull-verteilte Zufallsvariable aus einem einheitlichen (0,1) Wert U zu erzeugen, berechne einfach b * [- log (1-u)] ^ (1 / a). Dies ist die Umkehrfunktion von 1-P (X & gt; x), falls ich etwas falsch berechnet habe.
Vor Jahren geschrieben für PHP4, wählen Sie einfach Ihre Distribution:
%Vor%Der einfachste (aber nicht sehr effiziente) Weg, um Zufallszahlen zu erzeugen, die einer gegebenen Verteilung folgen, ist eine Technik namens Von Neumann Rejection .
Die einfache Erkundung der Technik ist dies. Erstellen Sie eine Box, die Ihre Distribution vollständig umschließt. (Lassen Sie uns Ihre Distribution f
nennen) Wählen Sie dann einen zufälligen Punkt (x,y)
in der Box. Wenn y < f(x)
, dann verwenden Sie x
als Zufallszahl. Wenn y > f(x)
, dann verwerfe sowohl x
als auch y
und wähle einen anderen Punkt. Fahren Sie fort, bis Sie eine ausreichende Menge an zu verwendenden Werten haben. Die Werte von x
, die Sie nicht ablehnen, werden gemäß f
verteilt.
Diese naive Art, es zu tun, wird höchstwahrscheinlich die Verteilung auf irgendeine Weise verzerren, die ich momentan nicht sehen kann. Die Idee besteht darin, einfach über Ihren ersten Datensatz, sortiert und paarweise, zu iterieren. Dann randomize 15 neue Zahlen zwischen jedem Paar, um das neue Array zu erhalten.
Ruby Beispiel, da ich nicht viel PHP spreche. Hoffentlich sollte solch eine einfache Idee leicht in PHP zu übersetzen sein.
%Vor%Tags und Links php random probability distribution