【问题标题】:Random Algorithm with adjustable probability概率可调的随机算法
【发布时间】:2015-06-10 12:14:20
【问题描述】:

我正在寻找一种算法(无论是哪种编程语言,也许是伪代码?),您可以在其中获得具有不同概率的随机数。

例如:

一个随机生成器,它模拟一个骰子,其中有“6”的机会 是 50%,其他 5 个数字是 10%。

算法应该是可扩展的,因为这是我的确切问题:

我有一个元素数组(或数据库),我想从中获取 选择 1 个随机元素。但是每个元素应该有不同的 被选中的概率。所以我的想法是每个元素都有一个 数字。这个数字除以所有数字的总和结果 随机选择数字的机会。

有人知道解决这个问题的好编程语言(或库)吗? 最好的解决方案是提供 1 个随机条目的良好 SQL 查询。 但我也会对使用其他编程语言的每一个提示或尝试感到满意。

【问题讨论】:

    标签: algorithm random


    【解决方案1】:

    实现它的简单算法是:

    1. 创建一个辅助阵列,其中sum[i] = p1 + p2 + ... + pi。这只完成一次。
    2. 当你画一个数字时,在[0,sum[n])上画一个均匀分布的数字r,然后对第一个高于均匀分布的随机数的数字进行二分搜索。可以使用binary search 高效地完成。

    不难看出,r确实位于一定范围[sum[i-1],sum[i])的概率确实是sum[i]-sum[i-1] = pi
    (在上面,为了完整起见,我们认为sum[-1]=0


    对于您的立方体示例:

    你有:

    p1=p2=....=p5 = 0.1
    p6 = 0.5
    

    首先,计算sum数组:

    sum[1] = 0.1
    sum[2] = 0.2
    sum[3] = 0.3
    sum[4] = 0.4
    sum[5] = 0.5
    sum[6] = 1
    

    那么,每次需要抽一个数字时:在[0,1)中抽一个随机数r,并选择最接近它的数字,例如:

    r1 = 0.45 -> element = 4
    r2 = 0.8 -> element = 6
    r3 = 0.1 -> element = 2
    r4 = 0.09 -> element = 1
    

    【讨论】:

      【解决方案2】:

      另一种答案。你的例子是百分比,所以设置一个有 100 个插槽的数组。 A 6 是 50%,因此将 6 放入 50 个插槽中。 1 到 5 个各占 10%,因此在 10 个插槽中放入 1 个,在 10 个插槽中放入 2 个等,直到您填满阵列中的所有 100 个插槽。现在根据您使用的语言,使用 [0, 99] 或 [1, 100] 中的均匀分布随机选择一个插槽。

      所选数组槽的内容将为您提供所需的分布。

      ETA:再想一想,您实际上并不需要数组,只需使用累积概率来模拟数组:

      r = rand(100) // In range 0 -> 99 inclusive.
      
      if (r < 50) return 6;  // Up to 50% returns a 6.
      if (r < 60) return 1;  // Between 50% and 60% returns a 1.
      if (r < 70) return 2;  // Between 60% and 70% returns a 2.
      etc.
      

      您已经知道哪些数字在哪些插槽中,因此只需使用累积概率来选择一个虚拟插槽:50; 50 + 10; 50 + 10 + 10; ...

      注意边缘情况以及 RNG 是 0 -> 99 还是 1 -> 100。

      【讨论】:

      • 谢谢,这对我的简单示例很有效,我也有这个想法。但这行不通,如果我不知道我将拥有多少元素或它们将拥有的概率。您的第二个想法与amit的解决方案非常相似。但也谢谢!
      猜你喜欢
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2013-01-01
      • 2017-11-26
      • 2011-10-20
      • 2013-12-18
      • 2017-05-16
      相关资源
      最近更新 更多