我需要使用PL/SQL(Oracle sql dev)生成50个随机数,范围从1到300.000.000我尝试使用floor(dbms_random.value(1, 300000000));这工作,但当我输出的数字,他们没有一个良好的分布(例如。我需要他们是不同的数字,如:45,2,829,2000000等)。相反,超过95%的人,有相同的位数(8在这种情况下,很少7)这不是我想要的。有什么办法我可以解决这个问题吗?
floor(dbms_random.value(1, 300000000));
juzqafwq1#
相反,超过95%的数字具有相同的位数(本例中为8位,很少为7位)让我们想一想,让我们看看1到300,000,000范围内的数字分布。
等等。或者换个说法......
一个好的随机数分布会有96%是9位或8位的,如果你得到的是位数的均匀分布,那就是一个坏的分布。Demonstration
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));
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|
fiddle
3条答案
按热度按时间juzqafwq1#
相反,超过95%的数字具有相同的位数(本例中为8位,很少为7位)
让我们想一想,让我们看看1到300,000,000范围内的数字分布。
等等。或者换个说法......
一个好的随机数分布会有96%是9位或8位的,如果你得到的是位数的均匀分布,那就是一个坏的分布。
Demonstration
cl25kdpy2#
我能想到的另一种方法是使用不同范围的相同函数,如-
ruyhziif3#
如果希望长度分布更均匀,则可以使用对数刻度,并生成一个介于0和log 10300000000之间的随机数,然后将10进行该次幂:
可输出:
| 随机值|
| - ------|
| 八个|
| 小行星16974213|
| 三一零|
| 七|
| 小行星24360|
| 五十七|
| 小行星1754|
| 小行星107512402|
| 小行星383|
| 小行星285|
| 三个|
| 小行星43978239|
| 小行星153212|
| 小行星907350|
| 小行星2732531|
| 1个|
| 小行星13877946|
| 小行星27677|
| 1个|
| 小行星1267448|
fiddle