我正在寻找一种算法(无论使用何种编程语言,可能是伪代码?),你会得到一个概率不同的随机数。
例如:
一个随机生成器,它模拟一个骰子的位置,其中有一个骰子。 是50%,其他5个数字是10%。
算法应该是可扩展的,因为这是我的确切问题:
我有一个元素的数组(或数据库),我想从中 选择1个随机元素。但每个元素都应该有所不同 被选中的概率。所以我的想法是每个元素都得到一个 数。并且这个数字除以所有数字的总和得出 随机选择数字的机会。
有人知道这个问题的编程语言(或库)吗? 最好的解决方案是提供1个随机条目的良好SQL查询。 但我也会对其他编程语言中的每一个提示或尝试感到满意。
答案 0 :(得分:3)
实现它的简单算法是:
sum[i] = p1 + p2 + ... + pi
的auexillary数组。这只能完成一次。r
上绘制一个均匀分布的数字[0,sum[n])
,然后二分搜索第一个数字高而不是均匀分布的随机数。可以有效地使用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
然后,每次需要绘制数字时:在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。