可调概率的随机算法

时间:2015-06-10 12:14:21

标签: algorithm random

我正在寻找一种算法(无论使用何种编程语言,可能是伪代码?),你会得到一个概率不同的随机数。

例如:

  

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

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

  

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

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

2 个答案:

答案 0 :(得分:3)

实现它的简单算法是:

  1. 创建一个sum[i] = p1 + p2 + ... + pi的auexillary数组。这只能完成一次。
  2. 绘制数字时,在r上绘制一个均匀分布的数字[0,sum[n]),然后二分搜索第一个数字而不是均匀分布的随机数。可以有效地使用binary search来完成。
  3. 很容易看出,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
    

    然后,每次需要绘制数字时:在r中绘制一个随机数[0,1),然后选择最接近它的数字,例如:

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

答案 1 :(得分:1)

另一种答案。您的示例是百分比,因此设置一个包含100个插槽的数组。 A为50%,因此在50个插槽中放入6个。 1到5每个都是10%,所以将1个放入10个插槽,2个放入10个插槽等,直到你填满阵列中的所有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。