加权随机一个值

时间:2014-05-23 19:00:04

标签: python random weighted

以下行返回一对坐标

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

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

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

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

3 个答案:

答案 0 :(得分:2)

我会分两步解决问题:

步骤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的回答

答案 1 :(得分: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的回答是正确的方法。

答案 2 :(得分:0)

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