Excel:将随机数放入数组的公式

Excel: Formula to place a random number in an array

这个让我很困惑,所以我想我会和你们分享,看看我得到了什么:)

一般问题

我在电子表格中有以下数据

如您所见,我有两组相同的标题'Cat, Dog, Man...'(准确的名称无关紧要)

这两个集合分类在 'From' 列或 'To' 行下。 table 的大部分是 0 到 1 之间的数字数组,或空单元格。

基本上我想做的是找到给定的 Rand() 数字在每个 中的排名。然后我 return 'To' 行中对应随机数放置位置的项目。

沿着第一行 Cat 阅读,随机数(也在 1 和 0 之间)排名。如果它在 0 和 0.3658 之间...我 return 猫,0.7193... 1 给了我 Van

所以 ideally I return 来自 To 组标题的值垂直高于上限Rand() 数字谎言。


尝试的解决方案

为了达到这个排名,我一直在使用 Match(value,array,0) 函数(0,因为我的数字是按升序排列的)。

因此,我的公式的简化版本是:

=Index(To_Headings,MATCH(RAND(),From_Row,0))

其中 To_Headings 是数组 E3:I3From_Row 是我使用进一步公式生成的数组,结果是 D#:I# (#与 From 标题相关的行号,因此必须是 4 到 8 之间的整数)

但是如果你特别细心,你会发现这是我的解决方案的不足之处

正如我所说,理想情况下我想找到 RAND() 所在位置的上限,因为它总是与我想要的输出在同一列中 标题。 MATCH() 参数为 0 returns RAND() 所在的下界。通常这是所需列左侧的第 1 列。

例如 再次沿着 Cat 行读取 - 对于随机数 0.5,它所在的边界是 0.3658...和 0.7193...。上限直接在 Dog 下面,我想要的输出。下部是所需 1 左侧的 1 列,因此在我的公式中,我只是在使用 Index

读取时向右移回

但是空白单元格使它变得毫无用处。对于 0.719... 和 1 之间的随机数,下限现在是上限左侧 列。在其他情况下,它可以是 3 或 4,实际上是任何数字。这是因为空白单元格 将上界 推向更右。


好的,考虑到所有这些,谁能告诉我如何对 RAND() 数字进行排名,以便它给出上限?当然,我已经尝试使用 -1 作为参数进行匹配,但是因为这需要降序,所以问题也会翻转!

我想我可以尝试计算下限右侧是否有任何空白,然后将我的 INDEX 偏移那么多而不是 1,但我可以看到这将添加一个我的代码有很多行,我真的需要保持它的精简,因为它将 运行 在大约 10000 个单元格中!!

你可以使用这个数组公式。

由于您的数据是按升序排列的,这将找到随机数小于或等于数据集中数字的第一个单元格:

=INDEX($E:$I,MATCH(TRUE,$J<=E4:I4,0))

作为数组公式,退出编辑模式时必须使用 Ctrl-Shift-Enter 而非 Enter 进行确认。如果操作正确,那么 Excel 将在公式周围放置 {}

我通过 Match 函数的实验找到了另一个非常简单的答案。

您所要做的就是用左边的数字填满这些空白。由于 Match 不会查找大于随机数的数字的第一个实例,而是查找 last,通过填写空白,所有调整都已为您完成.

所以现在的例子图片变成了下面这样:

因此,例如,再次沿着 Cat 行读取,0.719... 会重复。对于 0.8 的随机输入,而不是像以前那样停在 Dog 列(因为 0.8<1,因此 0.719... 是小于随机输入的最大数字),公式现在每次都在上限左侧停止 1 列。

现在我承认@ScottCraner 如前所述对我的问题给出了完美的答案,但是数组公式只能使用一个大小(没有 VBA),而单元格公式可以自动填充一个新范围,因此对于我的应用程序我不能使用那个答案。所以我想我会添加这个解决方案作为单元格公式方法。