2016-03-24 70 views
0

我發現這完全令人震驚,但DB2中的rand()函數偶爾返回值爲1。考慮對在它擁有大約150K行的表這個選擇:DB2中的隨機函數不是均勻分佈的

在大多數語言/ DB的,等等,我預計這將返回10行數據,與分佈爲大致相等。我實際上得到的是列,如下列:

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

令人震驚!在我的用例中,我正在更新表中的行並希望分配一個隨機值,但它需要隨機分佈,而不是上面的可怕情況。

所以我現在想我必須在一個循環中多次執行更新,在第二次...第n次迭代中繼續嘗試以不幸運行結束的行(以rand()結尾) = 1.0

或者,我可以使用rand()/ 1.00001,但這只是愚蠢的(也不是均勻分佈的)!不知道如何更好地處理這個問題(沒有,例如,寫UDF的,等等,將不勝感激)。

+0

它是否返回0的確切值?如果沒有,你可以通過四捨五入來做你想做的事。 –

+1

不知道爲什麼你會發現這個「令人震驚」或「驚人的」,因爲你的桶不相等。考慮到0.9和0.999999之間的每個隨機值進入「9」桶,但只有1.0正好進入「10」桶。 – mustaccio

回答

0

你會想到十行,但你得到11 - 和一個不喜歡預期的那麼只是過濾它...

替代: 在偉大的SQL Cookbook有很多的周圍隨機數的信息。檢查出來 - 也可以使用GENERATE_UNIQUE()

2

我就遇到了這個在2008年使用DB2/400 ...

蘭特()返回一個範圍[0,1]包容
蘭特()* 10返回浮點的浮點值在範圍值[0,10]包容

然後你轉換爲整數,你有什麼是以下

[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 

正如你所看到的,你就會有很多最終10比少任何其他號碼。

乘法之後是截斷問題。舍入而不是截斷不起作用,因爲仍然有一個範圍較小的值導致0或10.

許多rand()函數返回範圍[0,1)(不包括1)的值。但是DB2返回[0,1]。

我用DB2中的下列以獲得0和N

floor(rand() * N + 0.99999) 

之間的隨機整數,我認爲分配仍可能有點過,從「完美」。但對我來說已經夠好了。