Random 从任意大样本中进行伪随机选择时对不同结果进行加权

Random 从任意大样本中进行伪随机选择时对不同结果进行加权,random,probability,Random,Probability,所以,我坐在后院思考口袋妖怪,就像我们都习惯做的那样,这让我思考:当你遇到一个“随机”的口袋妖怪时,一些样本出现的频率比其他样本高很多,这意味着它们的权重不同于那些看起来较少的样本 现在,如果我要解决让不同的口袋妖怪以一定的概率出现的问题,我最有可能通过简单地增加某些口袋妖怪在选择池中的条目数量来实现这一点(就像这样) 所以C1有1/3的机会被拉,C2有1/6的机会,等等,但我知道这可能是一个非常简单和幼稚的方法,不太可能在大量选择的情况下很好地扩展 所以,我的问题是,S/O:给定一个任意大的样

所以,我坐在后院思考口袋妖怪,就像我们都习惯做的那样,这让我思考:当你遇到一个“随机”的口袋妖怪时,一些样本出现的频率比其他样本高很多,这意味着它们的权重不同于那些看起来较少的样本

现在,如果我要解决让不同的口袋妖怪以一定的概率出现的问题,我最有可能通过简单地增加某些口袋妖怪在选择池中的条目数量来实现这一点(就像这样)

所以C1有1/3的机会被拉,C2有1/6的机会,等等,但我知道这可能是一个非常简单和幼稚的方法,不太可能在大量选择的情况下很好地扩展


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

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

所以在上面的例子中有12个C。C1为4/12或~33%, C2为~17%的2/12%,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"
当您需要创建阵列时,装箱速度会慢一些,但是添加替代方案会更容易,因为您不需要每次都重新计算概率


您还可以从数组表示生成上面的if代码,这样在生成代码时只需执行一次预处理操作,然后从创建的代码中快速得到答案

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

所以在上面的例子中有12个C。C1为4/12或~33%, C2为~17%的2/12%,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"
当您需要创建阵列时,装箱速度会慢一些,但是添加替代方案会更容易,因为您不需要每次都重新计算概率


您还可以从数组表示生成上面的if代码,这样在生成代码时只需执行一次预处理操作,然后从创建的代码中快速得到答案

我考虑过这种方法,但在我看来,它会像我的另一种方法一样遭受同样的扩展问题。假设样本量为50000个对象,每个对象具有唯一的非离散概率;随机数的范围必须有多大?你必须给每个对象分配一个概率,除非对象之间存在某种潜在的联系,你也可以在选择代码中利用这种联系,否则你无法绕过这个概率。如果你想把这些项目分类,你也可以把它们作为选择,我编辑了这个问题。然而,50k似乎并没有那么多,它将取决于概率的精度。这种方法在浮点上的工作原理和在整数上的工作原理一样简单。随机数的范围需要是单个项目概率的总和。我考虑过这种方法,但在我看来,它会像我的另一种方法一样遭受同样的扩展问题。假设样本量为50000个对象,每个对象具有唯一的非离散概率;随机数的范围必须有多大?你必须给每个对象分配一个概率,除非对象之间存在某种潜在的联系,你也可以在选择代码中利用这种联系,否则你无法绕过这个概率。如果你想把这些项目分类,你也可以把它们作为选择,我编辑了这个问题。然而,50k似乎并没有那么多,它将取决于概率的精度。这种方法在浮点上的工作原理和在整数上的工作原理一样简单。随机数的范围需要是单个项目概率的总和。见
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