当从任意大样本中伪随机选择时加权不同的结果

时间:2010-09-14 16:34:45

标签: random probability

所以,我坐在后院思考口袋妖怪,因为我们都不会这样做,它让我思考:当你遇到一个'随机'口袋妖怪时,一些标本看起来比其他标本更频繁,意味着它们的权重与看起来较少的权重不同。

现在,如果我要解决让不同的口袋妖怪以一定概率出现的问题,我很可能只需增加某些口袋妖怪在选择池中的条目数量(如此),

Pool:
C1 C1 C1 C1
C2 C2
C3 C3 C3 C3 C3
C4

因此C1有1/3的机会被拉,C2有1/6的机会,等等,但我知道这可能是一个非常简单和天真的方法,并且不太可能与大量的选择。

所以,我的问题是,S / O:如果任意大的样本量,你会如何评价一个结果的概率大于另一个?并且,作为后续问题,假设您希望某些选项的概率以浮点精度与整数比率的比率发生?

1 个答案:

答案 0 :(得分:1)

如果您知道每个事件发生的概率,您需要将这些概率映射到0-100(或者如果您想使用实数和概率,则为0到1)。

所以在上面的例子中有12个Cs。 C1为4/12或~33%, C2为2 / 12~17%,C3为5/12或~42%,C4为1/12或~8%。

请注意,这些都加起来为100%。因此,如果我们选择0到100之间的随机数,我们可以将C1映射到0-33,C2到33-50(比C1的值多17个),C3到50-92,以及C4到92-100。

if语句可以做出选择:

r = rand() # between 0-100
if (r <33)
  return "C1"
elsif (r < 50)
  return "C2"
elsif (r < 92)
  return "C3"
elsif (r < 100)
  return "C4"

如果你想要比100中的1更精确,只需从1-1000或你想要的任何范围。可能更好的形式是使用整数并缩放它们而不是使用浮点数,因为如果值之间的差异变大,浮点可能会有奇怪的行为。

如果你想像上面展示的那样去分档路线,你可以尝试类似的东西(虽然这个想法更为通用,但是在红宝石中):

a = ["C1"]*4 + ["C2"]*2 + ["C3"]*5 + ["C4"]
# ["C1", "C1", "C1", "C1", "C2", "C2", 
#  "C3", "C3", "C3", "C3", "C3", "C4"]
a[rand(a.length)] # => "C1' w/ probability 4/12

由于您需要创建数组,因此Binning会更慢,但更容易添加替代项,因为您不需要每次都重新计算概率。

如果代码来自数组表示,您也可以生成上面的代码,这样您只需在生成代码时进行一次预处理命中,然后从创建的代码中获得快速答案。