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:I3
,From_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),而单元格公式可以自动填充一个新范围,因此对于我的应用程序我不能使用那个答案。所以我想我会添加这个解决方案作为单元格公式方法。
这个让我很困惑,所以我想我会和你们分享,看看我得到了什么:)
一般问题
我在电子表格中有以下数据
如您所见,我有两组相同的标题'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:I3
,From_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),而单元格公式可以自动填充一个新范围,因此对于我的应用程序我不能使用那个答案。所以我想我会添加这个解决方案作为单元格公式方法。