War es hilfreich?

Lösung

Warum für die Potenzgesetzverteilung, wenn Sie von der tatsächlichen Verteilung ziehen können?

Ich schlage vor, Sie die LastNames Tabelle ändern, um eine numerische Spalte enthält, die einen numerischen Wert, der die tatsächliche Anzahl der indivuduals mit einem Namen enthalten würde, die häufiger ist. Sie werden wahrscheinlich eine Nummer auf einem kleineren, aber proportional skaliert werden sollen, sagen, vielleicht 10.000 für jedes Prozent der Darstellung.

Die Liste würde dann in etwa so aussehen:
(Andere als die drei Namen in der Anfrage genannten, ich vermute, über Weiß, Johnson et al)

Smith          0   
White     10,060
Johnson   19,123
Williams  28,456
...
Sanders  200,987
..
Alderink 999,997

Und der Name Auswahl wäre

SELECT TOP 1 [LastName]
FROM [LastNames] as LN
WHERE LN.[number_described_above] < ROUND(100000 * RAND(), 0)
ORDER BY [number_described_above] DESC

Das ist der erste Name Kommissionierung, die Zahl nicht die [einheitliche Verteilung] Zufallszahl nicht übersteigt. Beachten Sie, wie die Abfrage, verwendet weniger als und Ordnung in ab -ending Ordnung; Dies wird garantieren, dass der allererste Eintrag (Smith) aufgenommen wird. Die Alternative wäre, die Serie mit Smith bei 10.060 zu starten, anstatt Null und der Zufall zieht kleiner als dieser Wert zu verwerfen.

Abgesehen von der Frage der Grenzverwaltung (beginnend bei Null statt 10.060) oben erwähnt, diese Lösung zusammen mit den beiden anderen Antworten so weit, ist die gleiche wie die in vorgeschlagen Dmckee ‘ s Antwort auf die Frage in dieser Frage verwiesen. Im Grunde ist die Idee, die CDF ( kumulative Verteilungsfunktion ) zu verwenden.


Bearbeiten :
Wenn Sie darauf bestehen, mit einer mathematischen Funktion, anstatt die tatsächliche Verteilung , die Folgendes sollte eine Potenzfunktion bereitzustellen, die irgendwie die „Long Tail“ Form der tatsächlichen Verteilung vermitteln würden. Sie wan kann den @PwrCoef Wert zu optimieren (die BTW nicht eine ganze Zahl sein muß), im Wesentlichen desto größer ist die coeficient, desto mehr schief an den Anfang der Liste der Funktion ist.

DECLARE @PwrCoef INT
SET @PwrCoef = 2
SELECT 88799 - ROUND(POWER(POWER(88799.0, @PwrCoef) * RAND(), 1.0/@PwrCoef), 0)

Weiteren Informationen:
  - die extra“0,0" in der Funktion ist über wichtige SQL zu zwingen float Operationen statt Integer-Operationen auszuführen
.   - der Grund, warum wir die Leistungsberechnung von 88.799 subtrahieren ist, dass die Berechnung der Verteilung derart ist, dass je näher eine Reihe näher am Ende unserer Skala, desto wahrscheinlicher ist es zu. Die Liste der Familiennamen werden in umgekehrter Reihenfolge (am wahrscheinlichsten Namen erste) sortiert, müssen wir diese Substraktion.

Unter der Annahme einer Leistung von beispielsweise 3 die Abfrage würde dann wie folgt aussehen etwas

SELECT [LastName]
FROM [LastNames] as LN
WHERE LN.[Rank]
     = 88799 - ROUND(POWER(POWER(88799.0, 3) * RAND(), 1.0/3), 0)

Welches ist die Abfrage von der Frage mit Ausnahme der letzten Zeile ist.

Re-Edit :
Bei der Betrachtung der tatsächlichen Verteilung, wie offensichtlich in den Volkszählungsdaten ist die Kurve sehr steil und erfordern würde ein sehr großen Leistungskoeffizienten, was wiederum würde dazu führen, überläuft und / oder extreme Rundungsfehler in den naiven Formel oben.
Ein sinnvoller Ansatz kann das heißt in mehreren Etagen zu bedienen sein, um eine gleiche Anzahl zur Durchführung des in jedem der zeichnet etwa drei Viertel (oder vier Viertel oder ...) der kumulativen Verteilung; Innerhalb jedem dieser Teilliste, würden wir mit einer Potenzfunktion, die möglicherweise mit dem gleichen coeficient, aber mit unterschiedlichen Bereichen zeichnen.
Zum Beispiel
Unter der Annahme, Terzen, die Liste gliedert sich wie folgt:

  • Erstes Drittel = 425 Namen, von Smith zu Alvarado
  • Zweites Drittel = 6.277 Namen, von zu Gainer
  • Letztes Drittel = 82.097 Namen, von Frisby bis zum Ende

Wenn wir nach Bedarf waren, sagt sie, 1000 Namen, wir 334 aus dem oberen Drittel der Liste ziehen würden, 333 aus dem zweiten Drittel und 333 aus dem letzten Drittel.
Für jedes der Drittel würden wir eine ähnliche Formel, vielleicht mit einem größeren Strom coeficient für das erste Drittel (wurden verwenden, sind in begünstigt die früheren Namen in der Liste wirklich interessiert, und auch dann, wenn die relativ Frequenzen sind statistisch relevant). Die drei Auswahlabfragen wie folgt aussehen könnte:

-- Random Drawing of a single Name in top third
--   Power Coef = 12
SELECT [LastName]
FROM [LastNames] as LN
WHERE LN.[Rank]
     =  425 - ROUND(POWER(POWER(425.0, 12) * RAND(), 1.0/12), 0)

-- Second third; Power Coef = 7
...
WHERE LN.[Rank]
     =  (425 + 6277) - ROUND(POWER(POWER(6277.0, 7) * RAND(), 1.0/7), 0)

-- Bottom third; Power Coef = 4
...
WHERE LN.[Rank]
     =  (425 + 6277 + 82097) - ROUND(POWER(POWER(82097.0, 4) * RAND(), 1.0/4), 0)

Andere Tipps

Statt die pdf als Rang zu speichern, speichern Sie die CDF (die Summe aller Frequenzen bis zu diesem Namen, ausgehend von Aldekirk).

Dann ändern Sie Ihre Auswahl das erste LN mit Rang größer als die Formel Ergebnis zu erhalten.

lese ich die Frage: „Ich brauche einen Strom von Namen zu erhalten, die die Häufigkeit der letzten Namen aus dem 1990 US Census Spiegel wird“

Ich habe vielleicht die Frage ein wenig anders als die anderen Vorschläge lesen, und obwohl eine Antwort akzeptiert wurde, und eine sehr durch ihre Antwort ist, werde ich meine Erfahrungen mit den Census Nachnamen beitragen.

hatte ich die gleichen Daten aus der Volkszählung von 1990 heruntergeladen. Mein Ziel war es eine große Anzahl von Namen zu produzieren Such Tests während der Leistungsprüfung von einer Krankenakte App eingereicht werden. I eingesetzt, um die Nachnamen und den Prozentsatz der Frequenz in eine Tabelle. I gegeben, um eine Säule gefüllt, und es mit einer ganzen Zahl, die das Produkt der „Gesamtnamen erforderlich * frequency“ war. Die Frequenzdaten aus der Volkszählung nicht hinzu, genau 100% bis so meine Gesamtzahl der Namen auch ein bisschen kurz von der Anforderung war. Ich konnte die Zahl durch die Auswahl zufällige Namen aus der Liste korrigieren und die Erhöhung ihre Zählung, bis ich genau die erforderliche Anzahl hatte, die zufällig hinzugefügt Zählung nie mehr als 0,05% der insgesamt 10 Millionen ammounted.

I erzeugt 10 Millionen Zufallszahl im Bereich von 1 bis 88799. Bei jeder Zufallszahl ich diesen Namen aus der Liste auswählen würde und verringere die Zähler für diesen Namen. Mein Ansatz war es, ein Kartenspiel zu simulieren, zu tun, außer mein Deck viele verschiedene Karten und eine varing Anzahl jeder Karte hatte.

Haben Sie speichern die tatsächlichen Frequenzen mit den Rängen?

Konvertieren der Algebra von akzeptierten Antwort auf MySQL ist nicht die Mühe, wenn Sie wissen, was für n zu verwendenden Werte. y wäre, was Sie gerade ROUND(88799 * RAND(), 0) haben und x0,x1 = 1,88799 Ich denke, wenn ich es falsch verstehen könnte. Der einzige Nicht-Standard-Mathematik-Operator aus einer T-SQL-Perspektive beteiligt ist ^ die gerade POWER(x,y) == x^y ist.

scroll top