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行中添加了标题。注意,这个表格可以在任何地方使用,即使在不同的表格上也是如此。 在最终产品中,我可能会隐藏这些行。 无论如何,它看起来像这样:

ListedSets

接下来,因为你需要一个随机数的列,所以在单元格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!错误,如下所述):

MainTable

你会注意到第三个公式引用了我们还没有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两个; 61
  • 1两个; 80

我们随机挑选五种可能性中的一种,对这些元素进行打乱并将结果填入列。

Sheet1中存储模板,在Sheet2中将输出存储在AZ列中。

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

在这里输入图像描述