Sql DB2中的随机函数不是均匀分布的

Sql DB2中的随机函数不是均匀分布的,sql,random,db2,Sql,Random,Db2,我觉得这完全令人震惊,但DB2中的rand()函数偶尔会返回一个值。考虑这个对一个有大约150 K行的表的选择: select integer(rand()*10) as Num, count(*) as N from TabWithAbout150KRows group by integer(rand()*10) order by 1 desc; 在大多数语言/DB等中,我希望返回10行数据,分布大致相等。我实际得到的是11行,如下所示: Num N --- ----- 10

我觉得这完全令人震惊,但DB2中的rand()函数偶尔会返回一个值。考虑这个对一个有大约150 K行的表的选择:

select integer(rand()*10) as Num, count(*) as N
from TabWithAbout150KRows
group by integer(rand()*10)
order by 1 desc;
在大多数语言/DB等中,我希望返回10行数据,分布大致相等。我实际得到的是11行,如下所示:

Num       N
---   -----
10       12 
9     14871 
8     14975 
7     15213 
6     15004 
5     15196 
4     14998 
3     14916 
2     14926 
1     15081 
0     15017 
令人震惊!在我的用例中,我正在更新表中的行,并希望分配一个随机值,但它需要随机分布,而不是上面可怕的情况

因此,我目前认为我必须在一个循环中进行多次更新,在第2…第n次迭代中继续,以重试那些不幸以rand()=1.0结束的行

或者,我可以使用rand()/1.00001,但这很愚蠢(而且分布也不均匀)


任何关于更好的方法的想法(例如,如果不编写自定义项等,我们将不胜感激)。

您希望并期望有十行,但您得到十一行,其中一行与预期不符,因此只需过滤它即可

备选方案:
在大宇宙中,有很多关于随机数的信息。检查它-也可以使用
GENERATE_UNIQUE()

您想要并期望有十行,但您得到十一行-其中一行与期望的不一样,所以只需过滤它

备选方案:
在大宇宙中,有很多关于随机数的信息。检查一下-也可以使用
GENERATE_UNIQUE()

我在2008年使用DB2/400遇到过这个问题

rand()返回一个范围为[0,1]的浮点值
rand()*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)

我认为发行版可能离“完美”还有一点距离。但对我来说已经足够好了。

我在2008年使用DB2/400遇到了这个问题

rand()返回一个范围为[0,1]的浮点值
rand()*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)

我认为分布可能仍然有点偏离“完美”。但它对我来说已经足够好了。

它是否会返回0的精确值?如果没有,你可以通过向上取整而不是向下取整来做你想做的事情。不确定你为什么会觉得这“令人震惊”或“令人震惊”因为你的桶不是相等的。考虑每一个随机值在0.9和0 999999之间…进入“9”桶,但是只有正好1进入“10”桶。它是否返回了0的确切值?如果不是,你可以通过围拢而不是向下做你想要的。不知道为什么你会发现这个“令人震惊”或“令人震惊”。因为桶是不相等的。考虑每一个随机值在0.9和0 999999之间…进入“9”桶,但是只有正好1进入“10”桶。