以下行返回一对坐标
coordinates = random.random()*640.0, random.random()*480.0
如何获得一对特定坐标,例如(100.0,100.0),概率为0.03。坐标是在循环中生成的,每次运行时循环次数不同,但循环的最大值为1000.
我不确定它是什么。谷歌表示它是加权随机的。但是所有示例都包含概率列表,我只有一个具有给定概率的特定值。
编辑:对不起伙计们,这是统一的采样,它是浮动的。答案 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的答案是可能更好......