【问题标题】:Generating random natural numbers with higher probability for lower numbers?为较低的数字生成概率较高的随机自然数?
【发布时间】:2021-06-30 15:14:48
【问题描述】:

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

有这样的功能吗?

【问题讨论】:

    标签: python random


    【解决方案1】:

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

    min(random.randint(a, b), random.randint(a, b))
    

    还有一个:

    min(random.randint(a, b), random.randint(a, b), random.randint(a, b))
    

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

    用户“pjs”写了以下评论:

    这两者都可以概括为相同的形式,即 k 阶统计的最小值,可以使用单个随机数生成,然后缩放到正确的范围:int(math.floor(a + (b - a + 1) * (1.0 - random.random()**(1.0 / k))))。当k == 2 具有三角形分布时,对于更高的k 值,它变得越来越偏向a。如果您想在 Monte Carlo sims 中使用“减少方差”策略玩游戏,那么基于单个随机数也可以使该方法适用于常见随机数或对立随机数。

    但是,这个公式存在问题。

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

    【讨论】:

    • 谢谢!太完美了。
    • 这两者都可以推广到相同的形式,k 订单统计的最小值,可以使用单个随机数生成,然后缩放到正确的范围:int(math.floor(a + (b - a + 1) * (1.0 - random.random()**(1.0 / k))))。当k == 2 具有三角形分布时,对于k 的更高值,它变得越来越偏向a。如果您想在 Monte Carlo sims 中使用“减少方差”策略玩游戏,那么基于单个随机数也可以使该方法适用于常见随机数或对立随机数。
    【解决方案2】:

    是的,有无数个函数可以做到这一点。成为合法离散概率分布的唯一要求是 p(x) ≥ 0 对于范围 [a, b] 中的所有 x,并且 sum(p(x)) = 1。因此,任何 g(x) 是在 [a, b] 范围内为非负且所有 a ≤ x ≤ b 的 g(x)

    如上所述,选择任何在 x 中递减的函数 g(x)(有无数个函数可供您选择),按照描述进行缩放,并从生成的 p(x) 生成。一旦你有一个 p(x) 的表,例如discrete inversionWalker's alias method,有几种方法可以从离散分布生成。

    【讨论】:

      猜你喜欢
      • 2012-11-25
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2016-01-06
      相关资源
      最近更新 更多