我正在寻找像Python的 random.randint() 这样的函数,它生成a和b之间的随机整数,但更有可能生成更接近a 的数字,只有少数更接近b。
有一个函数可以做到这一点吗?
您的问题很模糊,因为存在许多随机分布,其中较低的数字比较较高的数字更有可能。另外,“ a和b之间”的说法在这里同样含糊不清。这是许多示例之一,它按照您要求的方式在闭区间 [ a , b ] 中生成一个随机整数:
\nmin(random.randint(a, b), random.randint(a, b))\nRun Code Online (Sandbox Code Playgroud)\n这是另一个:
\nmin(random.randint(a, b), random.randint(a, b), random.randint(a, b))\nRun Code Online (Sandbox Code Playgroud)\n随着 越来越多random.randint(a, b),它们的最小值趋向于越来越集中于范围的下端。
用户“pjs”发表了以下评论:
\n\n\n这两者都可以推广到相同的形式,即 k 阶统计量的最小值,它可以使用单个随机数生成,然后缩放到正确的范围:
\nint(math.floor(a + (b - a + 1) * (1.0 - random.random()**(1.0 / k))))。当k == 2它具有三角形分布时,并且对于较高的值,k它的权重会越来越大a。如果您想在蒙特卡洛模拟中使用“方差减少”策略玩游戏,那么基于单个随机数也使得该方法适用于常见随机数或对立随机数。
然而,这个公式存在问题。
\nrandom.random()**(1.0 / k)在 1 附近病态,并且对于较大的 ,接近 1 k,因此在从 1/2 到 1 比从 0 到 1/2 更粗糙的常见浮点算术中,“有可能是一个准确性问题”(Devroye,1986,非均匀随机变量生成,第 675 页)。min(random.randint(a, b) for i in range(k))对于某些整数k对于某个大于 0 的