有没有办法在Excel中根据加权概率随机select一个单元格?

假设有一个名字列表:

Peter Andrew James John Philip Thomas Matthew 

我想随机select一个名字,我现在使用的公式是=RANDBETWEEN(1,7)=VLOOKUP(A3,$A$6:$B$12,2)

然而,是否有办法给每个名字加一个重量,以便select一个特定名字的可能性更大,因为我能想到的唯一方法就是将重复名称添加到列表中:

 Peter Peter Peter Peter Peter Andrew Andrew Andrew James James John Philip Thomas Thomas Thomas Thomas Matthew Mathhew 

这样一来彼得就会有最大的可能性被随机选中,因为这个名字出现得最多,但是如果有更有效的方法,我宁愿不要这样做。

任何回应表示赞赏。

此方法不需要额外的列或辅助单元。

而不是RANDBETWEEN(1,7) ,而是使用下面的公式:

 =CHOOSE(VLOOKUP(RANDBETWEEN(0,99),{0,1;28,2;45,3;55,4;60,5;65,6;87,7},2,1),1,2,3,4,5,6,7) 

这会给你一个加权大约等于你的长列表。

然后继续使用您的=VLOOKUP(A3,$A$6:$B$12,2)返回名称。

实现这一目标的一种方法是使用RANDBETWEEN与INDEX和MATCH的组合。

使用MATCH的最后一个参数来指定要应用的比较types,可以有效地使用值的范围来匹配(例如,如果<50,那么X,如果是76-75,那么如果是51-75,那么Y是Z)。 这意味着如果您在名称旁边添加了一个额外的列,并为每个值指定了上限值,您将能够有效地创build加权概率。

尝试在1-100之间添加所有名称的天花板,并尝试以下操作:

 =INDEX(A:A, MATCH(RANDBETWEEN(1,100),B:B,1)) 

这假设你的名字是在A,你的天花板在B

您可以在名称附近添加一个附加的左列,并添加意味着您期望的概率的数字。

 1 Peter 10 Andrew 15 James 25 John 75 Philip 95 Thomas 100 Matthew 

而现在..使用1到100之间的randbetween ,而不是使用randbetween作为虚假使用它作为真正的比赛…这将给你的衣柜号码的一轮。

 =VLOOKUP(A3,$A$6:$B$12,2,1) 

我偶然发现了相同的需求,并用VBA解决了这个问题。

在下面的VBA代码中,只需说明第2行的名称和权重:

 Private Sub CommandButton1_Click() RandomName = WeightedRnd(Array("Peter", "Andrew", "James"), Array(34, 33, 33)) MsgBox(RandomName) End Sub Function WeightedRnd(items As Variant, weights As Variant) As Variant Dim myItems(1 To 100) As Variant Dim weight As Variant Dim item As Variant Dim myNumber As Variant i = 1 n = 0 For Each weight In weights For p = 1 To weight myItems(i) = items(n) i = i + 1 Next n = n + 1 Next n = UBound(myItems) - LBound(myItems) + 1 pick = getRandom(1, n) WeightedRnd = myItems(pick) End Function Function getRandom(lowerbound, upperbound) Randomize getRandom = Int((upperbound - lowerbound + 1) * Rnd + lowerbound) End Function 

注意:确保你的权重的总和等于100或myItems数组的上限: Dim myItems(1 To 100) As Variant