我需要得到一个随机数,比如:20、50、10等。对于oracle,我可以使用这样的东西:
DBMS_RANDOM.VALUE(1, 7) * 10
但它不起作用,因为它使用的范围不正确。如何正确获取数字?
不要将ROUND
与DBMS_RANDOM
一起使用,因为您不会得到同样随机的分布,因为该范围中的最低值和最高值将有一半的机会生成为该范围中其他值。
如果希望所有数字的概率相等,请使用FLOOR
。
如果你想要以10为步长的10到70的数字,那么使用:
FLOOR( DBMS_RANDOM.VALUE( 1, 8 ) ) * 10
(注意:您将NEVER使用此方法获得值80,因为DBMS_RANDOM.VALUE
生成的值大于或等于下限,小于但不等于上限。(
例如,使用FLOOR( DBMS_RANDOM.VALUE( 1, 8 ) ) * 10
并使用以下查询生成随机10000行:
SELECT value,
COUNT(*)
FROM (
SELECT FLOOR( DBMS_RANDOM.VALUE( 1, 8 ) ) * 10 AS value
FROM DUAL
CONNECT BY LEVEL <= 10000
)
GROUP BY value
ORDER BY value;
将给出类似于的分布
VALUE|COUNT(*(----:|-------:1425年10月20 | 137030 | 148840 | 144150 | 143660 | 138270 | 1458
但是,使用ROUND( DBMS_RANDOM.VALUE( 1, 7 ) ) * 10
代替:
SELECT value,
COUNT(*)
FROM (
SELECT ROUND( DBMS_RANDOM.VALUE( 1, 7 ) ) * 10 AS value
FROM DUAL
CONNECT BY LEVEL <= 10000
)
GROUP BY value
ORDER BY value;
输出类似于:
VALUE|COUNT(*(----:|-------:10 | 85920 | 16681654年3月30日40 | 162550 | 163660 | 166870|890
您可以看到,极值的可能性是其他值的一半。
db<gt;小提琴这里
如果我正确地跟踪了您,那么您可以按如下方式使用round
:
Round(DBMS_RANDOM.VALUE(1, 7) * 10, -1)
它会将任何数字四舍五入到最接近的十位。此外,您可以在随机函数中使用6而不是7,因为四舍五入会使其接近十。