php - 固定比例选择

标签 php algorithm math probability

我有一组元素,我需要从中选择任何一个元素。每个元素都与一个百分比机会相关联。百分比相加为 100。

我需要从这些元素中选择一个,以便元素被选中的机会等于百分比值。所以如果一个元素有 25% 的机会,它应该有 25% 的机会被选中。换句话说,如果我们选择元素 100 万次,则该元素应该被选择近 25 万次。

最佳答案

您所描述的是一个多项式过程。

http://en.wikipedia.org/wiki/Multinomial_distribution#Sampling_from_a_multinomial_distribution

他们生成这种随机过程的方式是这样的: (我将使用伪代码,但将其转化为真实代码应该很容易。)

  1. 按照概率的相反顺序对“框”进行排序: (不需要。这只是一个优化) 这样你就有了例如 values=[0.45,0.3,0.15,0.1]

  2. 然后创建“累积”分布,它是索引 <=i 的所有元素的总和。 伪代码:

    cumulant=[0,0,0,0]    // initiate it
    s=0
    for j=0 to size()-1 {
       s=s+values[i] ; 
       cumulant[i]=s
    }
    

    在我们的例子中 cumulant=[0.45,0.70,0.85 ,1 ]

  3. 在 0 和 1 之间取一个统一的随机数 x。 对于 PHP:http://php.net/manual/en/function.rand.php

  4. 得到的随机框索引i是

    cumulant[i]< x 的最高 i

伪代码:

for j=0 to size()-1 {
  if !(cumulant[i]<){
     print "your index is ",i
     break;
  }

就是这样。回到第 3 点得到另一个随机索引 i。

如果您按照上面的建议排序,这意味着最终搜索会更快。例如,如果你有这个概率向量: 0.001 0.001 0.001 0.001 0.996 然后,当你对它进行排序时,你几乎总是只需要查看索引 i=0,因为随机数 x 几乎总是小于 0.996 .排序是否有效取决于您是否重复使用相同的“盒子”。所以,是的,25 万次尝试会有很大帮助。请记住,您获得的框索引 i 是针对已排序向量的。

关于php - 固定比例选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8986800/

相关文章:

php - mysqli where 子句与 php 出现错误

php - 如何更改Linux文件系统中的文件排序?

c++ - 已排序数组的一部分被反转

java - 返回可以用输入字符的子集组成的单词列表中的所有单词的集合

javascript - HTML5 透视网格

python - 算术运算中的暴力搜索算法

python - 如何解决 Python 中的函数逼近任务?

PHP - 使用循环重新排序

php - 替换php字符串的某些部分

java - 我想知道这是否是一个好的编程习惯,否则我如何才能更优化和高效地编写程序