生成PL SQL中的随机数



我需要使用PL/SQL (Oracle SQL dev)生成从1到300.000.000范围内的50个随机数

我试过使用floor(dbms_random.value(1, 300000000));

这是有效的,但是当我输出数字时,它们没有一个很好的分布(例如,我需要它们是不同数字的数字,如:45,2,829,200000等)。相反,超过95%的数字有相同的位数(在这种情况下是8,很少是7),这不是我想要的。我有什么办法可以补救吗?

相反,超过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:6 % (2/3)
  • 8:30 % (9/30)
  • 7:3 %(300个中的9个)
  • 6:3 % (9/3000)
  • 5: 0.03% (9/30000)

随机数的良好分布将有96%是9或8位数字。如果你得到的是数字的偶数分布,那将是一个糟糕的分布。

示范

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

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));

如果你想要一个更均匀的长度分布,那么你可以使用对数标度并生成一个介于0和log10300000000之间的随机数,然后将10取其幂:

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

可能输出:

RANDOM_VALUE169742133102436017541127410751240238321072852134397823915321290735027325310213877946276771267448

最新更新