【问题标题】:weighted random for one value only仅对一个值进行加权随机
【发布时间】:2014-05-23 19:00:03
【问题描述】:

下面一行返回一对坐标

coordinates = random.random()*640.0, random.random()*480.0

如何以 0.03 的概率获得一对特定的坐标,例如 (100.0, 100.0)。坐标在一个循环中生成,每次运行的循环数不同,但最大循环数为1000。

我不确定它是什么。谷歌说它是随机加权的。但是所有示例都包含概率列表,我只有一个具有给定概率的特定值。

编辑:对不起,这是统一采样,它是浮动的。

【问题讨论】:

  • 在 3% 的情况下,您很清楚您希望发生什么。在剩下的 97% 的情况下,您还不清楚您希望发生什么。你能澄清一下吗?

标签: python random weighted


【解决方案1】:

我会分两步解决这个问题:

第 1 步)使 (100,100) 出现 3% 的时间 - 从 0 到 1 滚动一个随机值。如果该值小于 0.03,则返回 (100, 100),否则继续第 2 步。

第 2 步)处理其他 97% 的情况。以您已经在做的方式返回您想要的任何值之间的随机坐标。目前还不清楚你想在这里发生什么 - 根据你的例子,我猜你想在 (0,0) 和 (640,480) 之间选择一个均匀分布的值。

在第 2 步中获得 (100, 100) 的可能性非常小。如果获得 (100, 100) 的概率恰好是 3% 且不超过 3% 非常重要,请检查在第 2 步中获得 (100,100) 并重新滚动,如果您偶然得到它。如果您生成浮点坐标,您可以忽略此检查,这是非常不可能的。

如果你的坐标只是整数,那么意外得到 (100, 100) 的可能性仍然很小,但它仍然可能发生。看pjs的回答

【讨论】:

  • 其余随机数是均匀分布(连续)。我生成花车。
  • 那么这是解决这个问题的正确方法,你应该接受它。
【解决方案2】:

在下文中,我假设您希望 97% 的概率均匀分布在不是 (100, 100) 的 640*480 - 1 整数坐标中。

我的提议与 Pete 的提议类似,但设置了精确概率(由Fraction 建立),因此在第二阶段指定坐标 (100, 100) 不是特殊情况。首先,让我们找出所需的确切概率:

>>> from fractions import Fraction
>>> p = Fraction(97, 100) / (640 * 480 - 1)
>>> p
Fraction(1, 316700)
>>> remainder = 1 - (640 * 480 * p)
>>> remainder
Fraction(95, 3167)

我们有97/100 的概率分布在非指定坐标上,因此每个坐标都应该以1 / 316700 的概率出现。让我们也把这么多的概率放在指定的坐标上。在这种情况下,(100, 100) 处的剩余概率计算为remainder。那么算法就变成了:

if random.random() <= remainder:
   coordinates = 100, 100
else:
   coordinates = random.randint(0, 639), random.randint(0, 479)

如果您确实想让结果是连续的,除了 (100, 100) 处的概率峰值之外,那么 Pete 的答案是正确的方法。

【讨论】:

    【解决方案3】:

    一种方法是生成一个包含 (100,100) 的 0.03*N 个条目和 0.97*N 个随机条目的列表,然后随机重新排序该列表......不过,对于大 N,@PeteBaughman 的答案可能更好...... .

    【讨论】:

    • 这实际上可能更好或更糟,具体取决于具体要求。对于 N = 1000,此方法将保证您获得 (100,100) 正好 30 次。如果您随机选择坐标并期望 (100,100) 的概率为 0.03,那么每 1000 次选择可能会得到 (100,100) 29 或 31 或 28 次等次
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多