小编典典

从具有加权概率的列表中随机选择

algorithm

我有一个由N个元素组成的数组(代表给定字母的N个字母),并且数组的每个单元格都包含一个整数值,该整数值表示该字母的给定文本中出现的次数。现在,我要根据给定约束的出现次数从字母表中的所有字母中随机选择一个字母:

  • 如果字母的值为正(非零),则可以始终通过算法选择字母(当然,概率更大或更小)。

  • 如果字母A的值大于字母B的值,则该算法必须更有可能选择它。

现在,考虑到这一点,我想出了一个可能完成这项工作的简单算法,但是我只是想知道是否还有更好的事情要做。这似乎是非常基本的,我认为可能需要做更多聪明的事情才能更有效地完成此任务。这是我认为的算法:

  • 将阵列中的所有频率相加。将其存储在SUM中
  • 从0到SUM中选择一个随机值。将其存储在RAN中
  • [同时] RAN> 0,从第一个开始,按顺序访问数组中的每个单元,然后从RAN中减去该单元的值
  • 最后访问的单元格是选定的单元格

那么,有没有比这更好的事情了?我想念什么吗?

我知道大多数现代计算机都可以如此快速地进行计算,我什至不会注意到我的算法是否效率低下,因此这更多是理论问题,而不是实际问题。

我更喜欢解释性的算法,而不仅仅是答案的代码,但是如果您更愿意以代码形式提供答案,那么我对此没有任何问题。


阅读 238

收藏
2020-07-28

共1个答案

小编典典

这个想法:

  • 遍历所有元素,并将每个元素的值设置为到目前为止的累积频率。
  • 产生一个介于1和所有频率之和之间的随机数
  • 做一个二进制搜索这个数上的值(发现的第一个值大于或等于所述数目)。

例:

Element    A B C D
Frequency  1 4 3 2
Cumulative 1 5 8 10

生成范围为1-10(1 + 4 + 3 + 2 = 10,与累积列表中的最后一个值相同)的随机数,进行二进制搜索,它将返回如下值:

Number   Element returned
1        A
2        B
3        B
4        B
5        B
6        C
7        C
8        C
9        D
10       D
2020-07-28