Excel中固定总和的特定范围的随机数
我想在Excel中创build一些随机列与这些特点:
- 每列有9个单元格
- 每个单元格是0,1或2
- 每列有SUM = 10
我尝试在列A中创build9个随机数,然后使用ROUND(B1/SUM(B$1:B$9);1)*10
作为列,但由于ROUND (我认为)并不完全正确,总和= 10(有些有8个其他10等)
例如:
- B列:0,1,1,1,1,1,1,2,2
- C栏:0,0,1,1,1,1,2,2,2
- D列:0,0,0,1,1,2,2,2,2
- E栏:0,0,0,0,2,2,2,2,2
依此类推,数字以任何顺序喜欢
- Z列:1,1,2,0,1,1,1,1,2
我能得到的最接近的是:
=IF(SUM(A$1:A1)>=10,0,IF(SUM(A$1:A1)=9,1,IF(SUM(A$1:A1)=8,2,RANDBETWEEN(1,2))))
把它放在A2中,一遍又一遍地复制。 它必须在第2行,否则会引起循环引用。
它用1或2填充列,直到总和为10,然后剩下的是零。
编辑
这是随机的,我可以得到,这将允许0
秒随机:
=IF(SUM(A$1:A1)>=10,0,IF(SUM(A$1:A1)=9,1,IF(SUM(A$1:A1)=8,2,IF(AND(SUM(A$1:A1)<=ROW()-2,ROW()>5),2,RANDBETWEEN(0,2)))))
只有5个可能的9个数字组合0,1和2(无视顺序),其中总数= 10。
- 2,2,2,2,2,0,0,0,0
- 2,2,2,2,1,1,0,0,0
- 2,2,2,1,1,1,1,0,0
- 2,2,1,1,1,1,1,1,0
- 2,1,1,1,1,1,1,1,1
把这些组合放在电子表格中:
╔════╦══════════════════════╤═════════╤═════════╤═ ════════╤═════════╕ │║A B B C C D D E E。 ╠════╬══════════════════════╪═════════╪═════════╪═ ════════╪═════════╡ ║1║正确组合│ ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║2║第1组│第2组│第3组│第4组│第5组│ ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║3║2 2 2 2 2 2 2 2 2。 ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║4║2 2 2 2 2 2 2 1 1。 ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║5║2 2 2 2 2 1 1 1 1。 ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║6║2 2 2 1 1 1 1 1 1。 ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║7║2 1 1 1 1 1 1 1 1。 ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║8║0 1 1 1 1 1 1 1 1。 ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║9║0 0 0 1 1 1 1 1 1。 ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║10║0 0 0 0 0 1 1 1 1。 ╟────╫──────────────────────┼─────────┼─────────┼─ ────────┼─────────┤ ║11║0 0 0 0 0 0 0 1 1。 ╙────╨──────────────────────┴─────────┴─────────┴─ ────────┴─────────┘
- 使用
RAND()
在列中产生9个随机数(比如单元格G3:G11) - 使用
RANK(G3,$G$3:$G$11)
来获取相邻列中的数字1-9的随机sorting列表。 - 使用
RANDBETWEEN(1,5)
随机select5个允许的数字组合中的一个(比如在单元格I2中) -
使用INDEX从允许值的9×5区域内引用随机select的列(1-5)中的单元格和随机sorting的行(1-9)。 例如:在单元格I3中:
=INDEX($A$3:$E$11,H3,$I$2)
-
您也可以将RANK()组合到索引函数中。
╔════╦═══════════════════════╤══════╤════════╤═══╤ ═══════════════════════╤════════╕ ║║G│H│I│J│K│L│ ╠════╬═══════════════════════╪══════╪════════╪═══╪ ═══════════════════════╪════════╡ ║1║││组:│││组:│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║2║随机数(order)│rank│3││随机数(order)│4│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║3║0.04│8│0││0.92│2│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║4║0.13│7│1││0.79│1│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║5║0.9│1│2││0.2│0│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║6║0.36│6│1││0.31│1│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║7║0.49│5│1││0.98│2│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║8║0.89│2│2││0.65│1│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║9║0 9 9 0 0│0. 0.68 1 1。 ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║10║0.84│3│2││0.57│1│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║11║0.65│4│1││0.28│1│ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║12║││││││ ╟────╫───────────────────────┼──────┼────────┼───┼ ───────────────────────┼────────┤ ║13║│1010││1010│ ╙────╨───────────────────────┴──────┴────────┴───┴ ───────────────────────┴────────┘
这是一个随机的解决scheme。 首先,创build一个可能的集合表。 鉴于您的限制,只有5套可能的解决scheme。 我把这个表格放在单元格B2:F10中,并在第1行中添加了标题。注意,这个表格可以在任何地方使用,即使在不同的表格上也是如此。 在最终产品中,我可能会隐藏这些行。 无论如何,它看起来像这样:
接下来,因为你需要一个随机数的列,所以在单元格A12中,我放入了一个名为# of Columns
的标题,在单元格B12中是这个公式(随意调整上下界以寻找你想要的东西,这是只是一个3到10之间的随机数): =RANDBETWEEN(3,10)
现在我们可以设置我们的随机列和他们使用的是什么集合:
-
在单元格B14中右键复制(到上一个公式中定义的最大列数,因此在这个例子中,因为B:K是10列,所以到K),使用这个公式:
=IF(COLUMN(A14)>$B$12,"","Column "&COLUMN(A14))
-
在单元格B15中,右键复制这个公式:
=IF(B14="","",INDEX($B$1:$F$1,,RANDBETWEEN(1,5)))
-
在单元格B16中,向右和向下复制9行(因此在本例中它被复制到K24)是这样的公式:
=IF(B$14="","",INDEX($B$2:$F$10,MATCH(LARGE(B$26:B$34,ROW(B1)),B$26:B$34,0),MATCH(B$15,$B$1:$F$1,0)))
-
完成后,它将如下所示(请注意,在完成此答案的下一步之前,它将显示
#NUM!
错误,如下所述):
你会注意到第三个公式引用了我们还没有build立的范围,在26:34行。 在这个范围内,还有另外一张桌子上摆满了随机数字,所以这些数据集可以被打乱,给我们随机的结果。 build立这个表很容易。 在单元格B26中,上下复制到K34(再次,超过最大列数和下行9行),是这样的公式:
=IF(B$14="","",RAND())
现在使用随机函数,你将得到如第二幅图所示的结果,随机的9个总和为10的数字,由0,1和2组成。 此时,您可以将“集合”和“随机数发生器”表剪切/粘贴到其他工作表(如果希望的话),或者只是隐藏这些行。
由于约束条件,只有5个值的唯一组合才能达到10:
- 5两个; 0一个人的; 4零
- 4两个; 2一个; 3零
- 3两个; 4一个人的; 2零
- 2两个; 6 , 1零
- 1两个; 8 , 0零
我们随机挑选五种可能性中的一种,对这些元素进行打乱并将结果填入列。
在Sheet1中存储模板,在Sheet2中将输出存储在A到Z列中。
在Sheet1中 :
代码:
Sub croupier() Dim Itms(1 To 9) As Variant Dim i As Long, J As Long, s1 As Worksheet, s2 As Worksheet Set s1 = Sheets("Sheet1") Set s2 = Sheets("Sheet2") For i = 1 To 26 J = Application.WorksheetFunction.RandBetween(1, 5) For k = 1 To 9 Itms(k) = s1.Cells(k, J).Value Next k Call Shuffle(Itms) For k = 1 To 9 s2.Cells(k, i).Value = Itms(k) Next k Next i End Sub Sub Shuffle(InOut() As Variant) Dim HowMany As Long, i As Long, J As Long Dim tempF As Double, temp As Variant Hi = UBound(InOut) Low = LBound(InOut) ReDim Helper(Low To Hi) As Double Randomize For i = Low To Hi Helper(i) = Rnd Next i J = (Hi - Low + 1) \ 2 Do While J > 0 For i = Low To Hi - J If Helper(i) > Helper(i + J) Then tempF = Helper(i) Helper(i) = Helper(i + J) Helper(i + J) = tempF temp = InOut(i) InOut(i) = InOut(i + J) InOut(i + J) = temp End If Next i For i = Hi - J To Low Step -1 If Helper(i) > Helper(i + J) Then tempF = Helper(i) Helper(i) = Helper(i + J) Helper(i + J) = tempF temp = InOut(i) InOut(i) = InOut(i + J) InOut(i + J) = temp End If Next i J = J \ 2 Loop End Sub
示例表2 :