algorithm - 概率可调的随机算法

标签 algorithm random

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

例如:

A random Generator, which simulates a dice where the chance for a '6' is 50% and for the other 5 numbers it's 10%.

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

I have a array (or database) of elements, from which i want to select 1 random element. But each element should have a different probability to be selected. So my idea is that every element get a number. And this number divided by the sum of all numbers results the chance for the number to be randomly selected.

有人知道解决这个问题的好编程语言(或库)吗? 最好的解决方案是一个好的 SQL 查询,它提供 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

关于algorithm - 概率可调的随机算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30756067/

相关文章:

c++ - 最大重叠事件数的持续时间

c++ - 将 32 位无符号整数精确转换为 (-1;1) 范围内的 float

algorithm - 寻找 DFA 结构的补集

php - 用随机数填充数组,同时遵守指定的总和、计数和数字边界

algorithm - 功能替代品?

python - python中的加权随机样本

c++ - 最快的加密安全随机数生成器

powershell - Powershell Get-Random cmdlet 的默认种子是什么

php - Laravel - 分页随机记录

MySQL - 连接同一个表 4 次,其中第 2,3 和 4 列随机且全部不同