Excel 在列表中查找新编号的位置

Excel 在列表中查找新编号的位置,excel,excel-formula,excel-2016,vba,Excel,Excel Formula,Excel 2016,Vba,我正在寻找一种方法来找到一个RAND()数字在0到1的无理(实际上也是RAND())数字列表中的位置 所以我在A1:A8中有一个数字列表,分别是0.1003,0.1984,0.3895,0.4506,0.4724,0.4856,0.5602,0.8542 然后我有一个RAND()。现在我尝试了RANK.AV(RAND(),A1:A8),但是RANK函数要求您的查找值在列表中 一个简单的解决方案是将我的RAND()放在列表的底部(A9),然后使用RANK.AV(A9,A1:A9),这样我的号码就包

我正在寻找一种方法来找到一个
RAND()
数字在0到1的无理(实际上也是RAND())数字列表中的位置

所以我在
A1:A8中有一个数字列表,分别是0.1003,0.1984,0.3895,0.4506,0.4724,0.4856,0.5602,0.8542

然后我有一个
RAND()。现在我尝试了
RANK.AV(RAND(),A1:A8)
,但是RANK函数要求您的查找值在列表中

一个简单的解决方案是将我的
RAND()
放在列表的底部(
A9
),然后使用
RANK.AV(A9,A1:A9)
,这样我的号码就包括在列表中,但是我必须对我的数千个RAND号码数组中的每个号码都这样做,这是不切实际的

也许有一种方法可以将另一个单元格加入到一个数组中,而无需将其相邻放置

例如,对于B1中的RAND(),我可以用C1写:


=RANK.AV(B1,ARRAY.JOIN(A1:A8,B1))
,但我尝试了几种方法(&,+),无法实现此数组连接功能,所以我想寻求帮助!可能需要宏或自定义项?

这可以实现您的目的:

=RANK.AVG(INDEX(A1:A8,RANDBETWEEN(1,COUNT(A1:A8))),A1:A8)

这将从随机数中排列一个随机选择。

这可以达到您的目的:

=RANK.AVG(INDEX(A1:A8,RANDBETWEEN(1,COUNT(A1:A8))),A1:A8)

这是随机数中的随机选择。

对不起@Chris,我相信这就是你在评论中的意思:-

=IF(B1<A1,1,MATCH(B1,$A$1:$A$10)+1)

如果您想考虑领带,您可以纠正它:-

=IF(B1<A1,1,MATCH(B1,$A$1:$A$10)+1)-COUNTIF($A$1:$A$10,B1)/2
A1中有一个零


如果有8个数字,我假设排名从1=最小到8=最大:你可以通过从count(A$1:A$10)+2或count(A$1:A$10)+1减去排名(如果包含零)来轻松更改排名。

对不起@Chris,我相信这就是你在评论中的意思:-

=IF(B1<A1,1,MATCH(B1,$A$1:$A$10)+1)

如果您想考虑领带,您可以纠正它:-

=IF(B1<A1,1,MATCH(B1,$A$1:$A$10)+1)-COUNTIF($A$1:$A$10,B1)/2
A1中有一个零



我假设如果有8个数字,排名从1=最小到8=最大:你可以通过从count(A$1:A$10)+2或count(A$1:A$10)+1中减去排名(如果包含零)来轻松更改它。

如果你的列表已排序(如你的示例所示)然后,您可以使用最后一个参数
True
来匹配
,以获得测试值的位置。我很确定,您需要一些VBA来将新数字插入列表中,并将其后的数字向下移动一个位置。对糟糕的措辞表示歉意;我实际上不需要将RAND()值放在列表中,只需要找到它在列表中的位置(数字)。在这种情况下,请参阅@Chris Neilsen的评论:Match将在新的随机数之前给出元素的位置,您将给出排名。如果他愿意的话,让他给出这个答案似乎是公平的。顺便说一句,如果rand()是基于一个合适的算法,那么与实数的联系是极不可能的,但是如果你想确定你的列表是否已排序(如你的示例所示),你可以将其编码进来然后,您可以使用最后一个参数
True
来匹配
,以获得测试值的位置。我很确定,您需要一些VBA来将新数字插入列表中,并将其后的数字向下移动一个位置。对糟糕的措辞表示歉意;我实际上不需要将RAND()值放在列表中,只需要找到它在列表中的位置(数字)。在这种情况下,请参阅@Chris Neilsen的评论:Match将在新的随机数之前给出元素的位置,您将给出排名。如果他愿意的话,让他给出这个答案似乎是公平的。顺便说一句,如果rand()是基于一个体面的算法,那么与实数的联系是极不可能的,但是如果你想确定的话,你可以把它编码进去,几乎,但不完全;您的方法从列表中选择一个随机数,赋予所有数字相等的权重。然而,我的列表并不是等距排列的,所以在两个间距较大的数字之间排名的几率应该比在两个距离较近的数字之间排名的几率要高。这对于我来说是必要的,但这种方法忽略了这一点。如果我没有弄错,这可能是您的解决方案
=RANK.AVG(VLOOKUP(RAND(),A1:A8,1,TRUE),A1:A8)
。这与它使一个随机数充当列表中的数字基本相同。事实上,我忽略了数字大于最大值或小于最小值的情况,并给出了这样的正确公式:
=IFERROR(RANK.AVG(VLOOKUP(B1,A1:A8,1,TRUE),A1:A8),IF(B1>max(A1:A8),1,COUNT(A1:A8)+1))
。我希望这是你需要的。差不多,但不完全;您的方法从列表中选择一个随机数,赋予所有数字相等的权重。然而,我的列表并不是等距排列的,所以在两个间距较大的数字之间排名的几率应该比在两个距离较近的数字之间排名的几率要高。这对于我来说是必要的,但这种方法忽略了这一点。如果我没有弄错,这可能是您的解决方案
=RANK.AVG(VLOOKUP(RAND(),A1:A8,1,TRUE),A1:A8)
。这与它使一个随机数充当列表中的数字基本相同。事实上,我忽略了数字大于最大值或小于最小值的情况,并给出了这样的正确公式:
=IFERROR(RANK.AVG(VLOOKUP(B1,A1:A8,1,TRUE),A1:A8),IF(B1>max(A1:A8),1,COUNT(A1:A8)+1))
。我希望这是你需要的。是的,汤姆,这就是我的意思。可能值得添加搜索范围需要排序的要求。谢谢-对我的答案进行了一些修饰。是的,汤姆,这就是我的意思。可能值得添加搜索范围需要排序的要求。谢谢-对我的答案进行了一些修饰。