在 Excel 中创建具有给定概率的动态数组
Creating a dynamic array with given probabilities in Excel
我想创建一个动态数组,returns 根据给定的概率计算 X 值。例如:
假设这是一个礼品盒,你可以打开它N次。我想要的是有 N 个随机结果。例如,我想随机获得这两种稀有性中的 5 种,但要基于它们的几率。
我现在有以下公式:
=index(A2:A3,randarray(5,1,1,rows(A2:A3),1). And this is the output I get:
这里的问题是我有一个包含 5 个结果但不是基于概率的动态数组。
如何将概率添加到数组中?
Donald Knuth 的系列书籍“计算机程序设计的艺术”第 2 卷“半数值算法”对随机选择的整个主题进行了非常详尽的处理。在那本书中,他提出了一种算法,可以使用伪随机数从列表中的 N 个项目中 恰好 X 选出。您可能没有考虑到的是,在您选择第一个项目后,如果您的第一个结果是“正常”,则概率数组已更改为 (X-1)/(N-1);如果您的第一个结果是“正常”,则概率数组已更改为 X/(N-1)第一个结果是“稀有”。这意味着您需要根据之前的结果跟踪一些 运行 总数,以确保您的概率随着每次选择而动态更新。您可以使用公式执行此操作,但我不确定反向引用将如何在数组公式中执行。 Microsoft 的动态数组文档指出此类内部数组引用被视为“循环”并且被禁止。
无论如何,试图将其扩展到 3+ 结果是非常有问题的。为了实现具有 3 个选择(X + Y + Z = N 选择)的算法,您需要将其分解为一个随机数用于 X 或非 X 选择,然后是第二个随机数用于 Y 或非 Y 选择.这成为一种递归算法,超出了 Excel 处理公式的能力。
这里是如何生成具有定义的条目概率的随机结果(Google 表格解决方案,不确定 Excel):
=ARRAYFORMULA(
VLOOKUP(
RANDARRAY(H1, 1),
{
{0; OFFSET(C2:C,,, COUNTA(C2:C) - 1)},
OFFSET(A2:A,,, COUNTA(C2:C))
},
2
)
)
我想创建一个动态数组,returns 根据给定的概率计算 X 值。例如:
假设这是一个礼品盒,你可以打开它N次。我想要的是有 N 个随机结果。例如,我想随机获得这两种稀有性中的 5 种,但要基于它们的几率。
我现在有以下公式:
=index(A2:A3,randarray(5,1,1,rows(A2:A3),1). And this is the output I get:
这里的问题是我有一个包含 5 个结果但不是基于概率的动态数组。
如何将概率添加到数组中?
Donald Knuth 的系列书籍“计算机程序设计的艺术”第 2 卷“半数值算法”对随机选择的整个主题进行了非常详尽的处理。在那本书中,他提出了一种算法,可以使用伪随机数从列表中的 N 个项目中 恰好 X 选出。您可能没有考虑到的是,在您选择第一个项目后,如果您的第一个结果是“正常”,则概率数组已更改为 (X-1)/(N-1);如果您的第一个结果是“正常”,则概率数组已更改为 X/(N-1)第一个结果是“稀有”。这意味着您需要根据之前的结果跟踪一些 运行 总数,以确保您的概率随着每次选择而动态更新。您可以使用公式执行此操作,但我不确定反向引用将如何在数组公式中执行。 Microsoft 的动态数组文档指出此类内部数组引用被视为“循环”并且被禁止。
无论如何,试图将其扩展到 3+ 结果是非常有问题的。为了实现具有 3 个选择(X + Y + Z = N 选择)的算法,您需要将其分解为一个随机数用于 X 或非 X 选择,然后是第二个随机数用于 Y 或非 Y 选择.这成为一种递归算法,超出了 Excel 处理公式的能力。
这里是如何生成具有定义的条目概率的随机结果(Google 表格解决方案,不确定 Excel):
=ARRAYFORMULA(
VLOOKUP(
RANDARRAY(H1, 1),
{
{0; OFFSET(C2:C,,, COUNTA(C2:C) - 1)},
OFFSET(A2:A,,, COUNTA(C2:C))
},
2
)
)