2016-03-24 6 views
0

Ich finde dies völlig erstaunlich, aber die Funktion rand() in DB2 gibt gelegentlich einen Wert von eins zurück. Betrachten Sie diese Auswahl gegen eine Tabelle, die über 150K Zeilen hat:Random-Funktion in DB2 ist nicht gleichmäßig verteilt

In den meisten Sprachen/DB, etc., würde ich erwarten, dass diese 10 Zeilen von Daten zurückzukehren, wobei die Verteilung in etwa gleich ist. Was ich tatsächlich bekommen, ist Reihen, wie in der folgenden:

Num  N 
--- ----- 
10  12 
9  14871 
8  14975 
7  15213 
6  15004 
5  15196 
4  14998 
3  14916 
2  14926 
1  15081 
0  15017 

Shocking! In meinem Anwendungsfall aktualisiere ich Zeilen in einer Tabelle und möchte einen zufälligen Wert zuweisen, der jedoch im Gegensatz zu der oben beschriebenen schrecklichen Situation zufällig verteilt sein muss.

Also denke ich derzeit, dass ich das Update mehrmals in einer Schleife machen muss, in den zweiten ... nten Wiederholungen fortfahrend, um die Reihen zu versuchen, die unglücklich genug waren, um mit rand zu enden() = 1.0

Oder ich könnte rand()/1.00001 verwenden, aber das ist nur albern (und nicht gleichmäßig verteilt, entweder)!

Irgendwelche Ideen zu einem besseren Weg, um dies zu nähern (ohne zum Beispiel UDFs usw. zu schreiben, würde geschätzt werden).

+0

Gibt es jemals den genauen Wert von 0 zurück? Wenn nicht, können Sie tun, was Sie wollen, indem Sie eher aufrunden als nach unten. –

+1

Nicht sicher, warum Sie diese "schockierend" oder "erstaunlich" finden, da Ihre Eimer nicht gleich sind. Beachten Sie, dass jeder zufällige Wert zwischen 0.9 und 0.999999 ... in den "9" -Knopf geht, aber nur genau 1.0 in den "10" -Knopf. – mustaccio

Antwort

0

Sie wollen und zehn Reihen erwarten, aber man bekommt elf - und man ist nicht so erwartet mag es einfach filtern ...

Alternative: In der großen SQL Cookbook gibt es viele Informationen rund um Zufallszahlen. Überprüfen Sie es - auch GENERATE_UNIQUE() könnte verwendet werden.

2

ich in diese lief im Jahr 2008 mit DB2/400 ...

rand() einen Gleitkommawert mit einem Bereich von [0,1] inklusive
rand() * 10 kehrt Gleitkomma zurück Wert im Bereich [0,10] inklusive

Dann wandeln Sie auf eine ganze Zahl, was Sie haben die

[0.000, 0.9999] => 0 
[1.000, 1.9999] => 1 
[2.000, 2.9999] => 2 
[3.000, 3.9999] => 3 
[4.000, 4.9999] => 4 
[5.000, 5.9999] => 5 
[6.000, 6.9999] => 6 
[7.000, 7.9999] => 7 
[8.000, 8.9999] => 8 
[9.000, 9.9999] => 9 
[10.000, 10.000] => 10 

Wie Sie sehen können, werden Sie mit viel weniger 10 ist am Ende finden als jede andere Nummer.

Die Multiplikation gefolgt von der Kürzung ist das Problem. Runden statt Abschneiden hilft nicht, da immer noch ein kleinerer Wertebereich 0 oder 10 ergibt.

Viele rand() - Funktionen geben einen Wert im Bereich [0,1] zurück (1 ist ausgeschlossen). DB2 gibt jedoch [0,1] zurück.

Ich habe folgend in DB2 zu erhalten Zufallszahl zwischen 0 und N

floor(rand() * N + 0.99999) 

Ich denke, die Verteilung kann noch ein wenig abseits von „perfekt“ sein verwendet. Aber es war gut genug für mich.

Verwandte Themen