在Excel中分配概率的随机数

时间:2017-09-15 00:28:27

标签: excel excel-vba excel-formula vba

以下是我要做的事情:

我有一堆物品,让我们说从A到J,总共10件物品。现在我想生成总共20个平局,在每个平局中我需要以上10个项目中的3个项目。现在,如果第一个项目是A,则它不应出现在第二个和第三个项目中,而不管其分配的概率。

让我们说:

A - 4%
B - 20%
C - 1%
D - 16%
E - 5%
F - 7%
G - 3%
H - 21%
我 - 6%
J - 17%

现在,我需要根据他们分配的概率在每次抽奖中从上面的列表中随机生成3个项目,但是假设第一个项目是B,第二个和第三个项目不应该是B.我应该重复相同的20抽奖的过程。

答案应该是这样的:

         1st Item    2nd Item   3rd Item
1st Draw   B            D           J
2nd Draw   D            E           F
3rd Draw   B            H           G

应根据指定的概率生成数字。

提前致谢。

3 个答案:

答案 0 :(得分:2)

对于公式路线:

您需要构建两个辅助列。第一个是总计

我把你的价值放在G1:H10

然后在I1中我放了1

在I2中我放了:

=I1+(H1*100)

并复制下来:

enter image description here

然后我创建了第二个帮助器。在K1中,我把:

=INDEX(G:G,MATCH(ROW(1:1),I:I))

并向下复制了100行。

enter image description here

这创造了概率的动态范围。

然后在B2中我放了:

=INDEX($K:$K,AGGREGATE(15,6,ROW($1:$100)/(COUNTIF($A2:A2,$K$1:$K$100)=0),RANDBETWEEN(1,100-SUMPRODUCT(COUNTIF($A2:A2,$K$1:$K$100)))))

复制三次,尽可能多地下载:

enter image description here

注意事项:

  • 这仅适用于整个百分比,没有20.513%
  • 表格中的每个选项必须至少为1%
  • 总百分比必须等于100%

答案 1 :(得分:1)

根据本网站(https://www.mrexcel.com/forum/excel-questions/372071-random-numbers-assigned-probabilities.html)#7的帖子,这是另一种方式。您可以使用累计值并进行类似的测试。

添加helper column C并使用以下公式:=SUM($B$2:B2),然后向下拖动。

cell F2上,您可以输入以下公式:

=INDEX($A$2:$A$11,COUNTIF($C$2:$C$11,"<="&RAND())+1)

它基本上是使用RAND函数对行进行计数,并添加1(标题行)来选择项目。试一试,让我知道。

答案 2 :(得分:0)

这里结合了前两个答案中的方法。像ian0411的答案一样,它利用了累积概率分布。它还利用Scott Craner的技术构建0和1的数组,表明可能的结果(A,...,J)与已经绘制的结果之间的匹配。

单元格P2中的公式为

=INDEX($A$2:$A$11,1+IFERROR(MATCH(RAND(),MMULT($D$2:$M$11,($B$2:$B$11)*(1-COUNTIF($O2:O2,$A$2:$A$11))/SUMPRODUCT($B$2:$B$11,(1-COUNTIF($O2:O2,$A$2:$A$11))))),0))

并将其复制到单元格Q2R2中,然后在每次抽奖时向下拖动。

enter image description here

$B$2:$B$11中的概率分布将当前抽取中任何先前绘制的项目的元素替换为零(对于如何实现这一点,向Scott提供了帽子提示)。调整后的分布通过kludgy矩阵乘法运算(无法想到更优雅的方法)转换为累积格式,并归一化为&#34;适当的&#34;累积分布除以其元素之和。我没有使用=1+COUNTIF(cumdist,"<="&RAND())(其中cumdist是累积分布)来挑选与随机变量匹配的cumdist元素,而是使用了=1+IFERROR(MATCH(RAND(),cumdist),0)的替代方法。