我在寻找一种算法(不管是哪种编程语言,还是伪代码?)得到不同概率的随机数。
例如:
随机发生器,它模拟一个骰子,其中'6‘的几率为50%,而其他5个数字的概率为10%。
算法应该是可伸缩的,因为这正是我的问题:
我有一个元素数组(或数据库),我想从中选择一个随机元素。但是每个元素应该有一个不同的概率来选择。所以我的想法是每个元素都有一个数字。这个数除以所有数字的和,就有机会随机选择这个数字。
有人知道一个很好的编程语言(或库)来解决这个问题吗?最好的解决方案是一个好的SQL查询,它提供1个随机条目。但我也会对其他编程语言的每一个提示或尝试感到满意。
发布于 2015-06-10 12:18:25
实现这一目标的一个简单算法是:
sum[i] = p1 + p2 + ... + pi。这只做了一次。r上均匀分布的数字,二进制搜索第一个数字比均匀分布的随机数要高的。它可以有效地利用二进制搜索来完成。很容易看出,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发布于 2015-06-10 12:35:24
另一个答案。您的例子是百分比,所以设置一个包含100个插槽的数组。A6是50%,所以在50个插槽中放6。1到5是在10%的每个,所以放置1/ 10插槽,2/ 10插槽等,直到你已经填补了数组中的所有100个插槽。现在,根据您使用的语言,使用0,99或1100中的统一分布随机选择其中的一个插槽。
所选数组槽的内容将为您提供所需的分发。
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;.
注意边缘情况,以及您的RNG是0 -> 99还是1 -> 100。
https://stackoverflow.com/questions/30756067
复制相似问题