为较小的数字生成具有较高概率的随机自然数?

Sub*_*nge 5 python random

我正在寻找像Python的 random.randint() 这样的函数,它生成ab之间的随机整数,但更有可能生成更接近a 的数字,只有少数更接近b

有一个函数可以做到这一点吗?

Pet*_* O. 5

您的问题很模糊,因为存在许多随机分布,其中较低的数字比较较高的数字更有可能。另外,“ ab之间”的说法在这里同样含糊不清。这是许多示例之一,它按照您要求的方式在闭区间 [ a , b ] 中生成一个随机整数:

\n
min(random.randint(a, b), random.randint(a, b))\n
Run Code Online (Sandbox Code Playgroud)\n

这是另一个:

\n
min(random.randint(a, b), random.randint(a, b), random.randint(a, b))\n
Run Code Online (Sandbox Code Playgroud)\n

随着 越来越多random.randint(a, b),它们的最小值趋向于越来越集中于范围的下端。

\n

用户“pjs”发表了以下评论:

\n
\n

这两者都可以推广到相同的形式,即 k 阶统计量的最小值,它可以使用单个随机数生成,然后缩放到正确的范围:int(math.floor(a + (b - a + 1) * (1.0 - random.random()**(1.0 / k))))。当k == 2它具有三角形分布时,并且对于较高的值,k它的权重会越来越大a。如果您想在蒙特卡洛模拟中使用“方差减少”策略玩游戏,那么基于单个随机数也使得该方法适用于常见随机数或对立随机数。

\n
\n

然而,这个公式存在问题。

\n
    \n
  • 其一,存在精度问题:该表达式random.random()**(1.0 / k)在 1 附近病态,并且对于较大的 ,接近 1 k,因此在从 1/2 到 1 比从 0 到 1/2 更粗糙的常见浮点算术中,“有可能是一个准确性问题”(Devroye,1986,非均匀随机变量生成,第 675 页)。
  • \n
  • 其次,调用浮点数只是为了在 \xe2\x80\x94 末尾输出随机整数是相当不雅的,毕竟计算机是通过转换整数来生成随机浮点变量的,而不是相反。
  • \n
  • 最后,我们通常不应该关心随机变量生成方法之间的效率(性能),除非我们在应用程序中使用它们,测量了运行时间,并发现运行时间是不可接受的。这是一个称为“过早优化”的一般编程问题。尽管我在这个答案中的方法可能使用许多随机变量,但它很方便,特别是因为我们可以将其重写为:min(random.randint(a, b) for i in range(k))对于某些整数k对于某个大于 0 的
  • \n
\n