首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >概率可调的随机算法

概率可调的随机算法
EN

Stack Overflow用户
提问于 2015-06-10 12:14:20
回答 2查看 347关注 0票数 1

我在寻找一种算法(不管是哪种编程语言,还是伪代码?)得到不同概率的随机数。

例如:

随机发生器,它模拟一个骰子,其中'6‘的几率为50%,而其他5个数字的概率为10%。

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

我有一个元素数组(或数据库),我想从中选择一个随机元素。但是每个元素应该有一个不同的概率来选择。所以我的想法是每个元素都有一个数字。这个数除以所有数字的和,就有机会随机选择这个数字。

有人知道一个很好的编程语言(或库)来解决这个问题吗?最好的解决方案是一个好的SQL查询,它提供1个随机条目。但我也会对其他编程语言的每一个提示或尝试感到满意。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-10 12:18:25

实现这一目标的一个简单算法是:

  1. 创建一个自动数组,其中sum[i] = p1 + p2 + ... + pi。这只做了一次。
  2. 当你画一个数字时,画一个在r上均匀分布的数字,二进制搜索第一个数字比均匀分布的随机数要高的。它可以有效地利用二进制搜索来完成。

很容易看出,r位于一定范围内的概率确实是[sum[i-1],sum[i]),实际上是sum[i]-sum[i-1] = pi

(在上面,我们认为sum[-1]=0是完整的)

对于多维数据集示例:

你有:

代码语言:javascript
运行
复制
p1=p2=....=p5 = 0.1
p6 = 0.5

首先,计算sum数组:

代码语言:javascript
运行
复制
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),并选择最接近它的数字,例如:

代码语言:javascript
运行
复制
r1 = 0.45 -> element = 4
r2 = 0.8 -> element = 6
r3 = 0.1 -> element = 2
r4 = 0.09 -> element = 1
票数 3
EN

Stack Overflow用户

发布于 2015-06-10 12:35:24

另一个答案。您的例子是百分比,所以设置一个包含100个插槽的数组。A6是50%,所以在50个插槽中放6。1到5是在10%的每个,所以放置1/ 10插槽,2/ 10插槽等,直到你已经填补了数组中的所有100个插槽。现在,根据您使用的语言,使用0,99或1100中的统一分布随机选择其中的一个插槽。

所选数组槽的内容将为您提供所需的分发。

ETA:再想一想,您实际上并不需要数组,只需使用累积概率来模拟数组:

代码语言:javascript
运行
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30756067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档