oracle 在PL SQL中生成随机数

6ljaweal  于 2022-12-18  发布在  Oracle
关注(0)|答案(3)|浏览(260)

我需要使用PL/SQL(Oracle sql dev)生成50个随机数,范围从1到300.000.000
我尝试使用floor(dbms_random.value(1, 300000000));
这工作,但当我输出的数字,他们没有一个良好的分布(例如。我需要他们是不同的数字,如:45,2,829,2000000等)。相反,超过95%的人,有相同的位数(8在这种情况下,很少7)这不是我想要的。有什么办法我可以解决这个问题吗?

juzqafwq

juzqafwq1#

相反,超过95%的数字具有相同的位数(本例中为8位,很少为7位)
让我们想一想,让我们看看1到300,000,000范围内的数字分布。

  • 9:200,000,000(从100,000,000到300,000,000)
  • 8:约90.000.000(10.000.000至99.999.999)
  • 7:约9.000.000(1.000.000至9.999.999)
  • 6:约900.000(100.000至999.999)
  • 5:约90.000(10.000至99.999)

等等。或者换个说法......

  • 9:66%(三分之二)
  • 8:30%(30个中的9个)
  • 7:3%(300人中有9人)
  • 6:0.3%(3000人中有9人)
  • 5:0.03%(3万人中有9人)

一个好的随机数分布会有96%是9位或8位的,如果你得到的是位数的均匀分布,那就是一个坏的分布。
Demonstration

cl25kdpy

cl25kdpy2#

我能想到的另一种方法是使用不同范围的相同函数,如-

floor(dbms_random.value(1, 10));
floor(dbms_random.value(11, 100));
floor(dbms_random.value(101, 1000));
floor(dbms_random.value(1000, 100000));
floor(dbms_random.value(100001, 300000000));
ruyhziif

ruyhziif3#

如果希望长度分布更均匀,则可以使用对数刻度,并生成一个介于0和log 10300000000之间的随机数,然后将10进行该次幂:

SELECT FLOOR(POWER(10, DBMS_RANDOM.VALUE(0, LOG(10, 300000000)))) AS random_value
FROM   DUAL
CONNECT BY LEVEL <= 20

可输出:
| 随机值|
| - ------|
| 八个|
| 小行星16974213|
| 三一零|
| 七|
| 小行星24360|
| 五十七|
| 小行星1754|
| 小行星107512402|
| 小行星383|
| 小行星285|
| 三个|
| 小行星43978239|
| 小行星153212|
| 小行星907350|
| 小行星2732531|
| 1个|
| 小行星13877946|
| 小行星27677|
| 1个|
| 小行星1267448|

  • 注意:使用对数标度时,得到数字1-10的概率与得到值11-100或1001-10000或10001-100000等的概率相同。因此,7出现的概率是70的10倍,是700的100倍。*

fiddle

相关问题