我想要生成没有上限的随机自然数。
例如,我可以使用random.randint(1, 1000)生成随机自然数,但我不想指定上限。我怎样才能做到这一点?
发布于 2022-09-12 11:15:52
这里的主要问题甚至不是计算机能够保留的最大整数(包括在产生如此大的随机数时暂时保持的整数)。假设PO在获得非常大的数字时同意牺牲精度,并同意将它们保留为float。
这里的根本问题实际上是这个自然数的分布。random.randint(1, 1000)从均匀分布返回一个随机整数。如果没有上界,这种分布是不存在的,因为概率质量函数 (pmf)只返回零。从-∞到+∞的pmf积分必须等于1,这在没有上界的均匀分布下是不可能的,因为它不能在右边收敛。
然而,自然数的其他离散分布,虽然不限于右边,但整数越大,其概率就越小。但是,在Python中生成它们的包通常使用numpy数据类型(非常有限,比如C,与常规Python和Wolfram不同的是整数大小),因此在Python中还是有一个固有的绑定。
from scipy.stats import nbinom
print(nbinom.rvs(1e10, 0.5, size=1) + 1)我们可以尝试用正则Python编写一个数值算法来生成这个负二项式+1随机变量,由连续均匀分布产生的随机数从0.0到1.0,每次计算前者的pmf在正则Python中的积分(并将其转换为分位数函数),但效率会很低。
发布于 2022-09-12 10:37:47
不可能从0到无穷远选择一个数字。但是,您可以使用sys.maxsize作为上限,这是支持的最大数目。不要忘记导入sys模块。
import sys
发布于 2022-09-12 11:03:53
如果我们注意到p( n )画n的概率,即使p(n)不可能降到0,p(n)级数仍然是收敛的,其和等于1,所以p(n)必须下降得足够快。
一种可能性是采用指数分布。分布的参数决定了随机数的有限平均值。
简单地说,这个发行版返回一个浮点数,所以我们必须使用int()转换函数。
就像这样,目标是20的平均值:
$ python3
Python 3.10.6 (main, Aug 2 2022, 00:00:00) [GCC 12.1.1 20220507 (Red Hat 12.1.1-1)] on linux
...
>>>
>>> import numpy as np
>>>
>>> ys = list(map(int, np.random.exponential(20, 10)))
>>>
>>> ys
[7, 5, 36, 4, 10, 3, 26, 45, 9, 17]
>>>
>>> ys2 = list(map(int, np.random.exponential(20, 100)))
>>>
>>> sum(ys2) / len(ys2)
18.89
>>>
>>> ys4 = list(map(int, np.random.exponential(20, 10000)))
>>>
>>> sum(ys4) / len(ys4)
19.5025
>>>
>>> min(ys4)
0
>>> max(ys4)
207
>>>
>>> quit()
$ https://stackoverflow.com/questions/73687905
复制相似问题