在Excel中具有固定总和的特定范围的随机数

时间:2016-06-10 12:42:19

标签: excel random excel-formula

我想在Excel中创建一些具有以下特征的随机列:

  • 每列有9个单元格
  • 每个单元格为0,1或2
  • 每列有SUM = 10

我尝试在A列中创建9个随机数,然后使用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { /* - - - - */ /* - - - - */ [cell.yourButton setTag:indexPath.row]; /* - - - - */ /* - - - - */ } 作为列,但由于 ROUND (我认为)它并不完全正确,因为并非所有列都具有sum = 10(有些人还有8人等10人)

例如:

  • B栏:0,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

4 个答案:

答案 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    │    C    │    D    │    E    │
╠════╬══════════════════════╪═════════╪═════════╪═════════╪═════════╡
║ 1  ║                      CORRECT COMBINATIONS                    │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 2  ║ Group 1              │ Group 2 │ Group 3 │ Group 4 │ Group 5 │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 3  ║ 2                    │ 2       │ 2       │ 2       │ 2       │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 4  ║ 2                    │ 2       │ 2       │ 2       │ 1       │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 5  ║ 2                    │ 2       │ 2       │ 1       │ 1       │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 6  ║ 2                    │ 2       │ 1       │ 1       │ 1       │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 7  ║ 2                    │ 1       │ 1       │ 1       │ 1       │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 8  ║ 0                    │ 1       │ 1       │ 1       │ 1       │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 9  ║ 0                    │ 0       │ 1       │ 1       │ 1       │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 10 ║ 0                    │ 0       │ 0       │ 1       │ 1       │
╟────╫──────────────────────┼─────────┼─────────┼─────────┼─────────┤
║ 11 ║ 0                    │ 0       │ 0       │ 0       │ 1       │
╙────╨──────────────────────┴─────────┴─────────┴─────────┴─────────┘
  • 使用RAND()在列中生成9个随机数(比如单元格G3:G11)
  • 使用RANK(G3,$G$3:$G$11)获取相邻列中随机排序的数字1-9列表。
  • 使用RANDBETWEEN(1,5)随机选择5个允许的数字组合中的一个(比如在单元格I2中)
  • 使用INDEX从允许值的9x5区域内引用随机选择列(1-5)中的单元格和随机排序的行(1-9)。例如:在单元格I3中:=INDEX($A$3:$E$11,H3,$I$2)

  • 您也可以将RANK()组合到索引函数中。

╔════╦═══════════════════════╤══════╤════════╤═══╤═══════════════════════╤════════╕
║    ║           G           │  H   │   I    │ J │           K           │   L    │
╠════╬═══════════════════════╪══════╪════════╪═══╪═══════════════════════╪════════╡
║ 1  ║                       │      │ group: │   │                       │ group: │
╟────╫───────────────────────┼──────┼────────┼───┼───────────────────────┼────────┤
║ 2  ║ RANDOM number (order) │ rank │    3   │   │ RANDOM number (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    │ 0      │   │ 0.68                  │ 1      │
╟────╫───────────────────────┼──────┼────────┼───┼───────────────────────┼────────┤
║ 10 ║ 0.84                  │ 3    │ 2      │   │ 0.57                  │ 1      │
╟────╫───────────────────────┼──────┼────────┼───┼───────────────────────┼────────┤
║ 11 ║ 0.65                  │ 4    │ 1      │   │ 0.28                  │ 1      │
╟────╫───────────────────────┼──────┼────────┼───┼───────────────────────┼────────┤
║ 12 ║                       │      │        │   │                       │        │
╟────╫───────────────────────┼──────┼────────┼───┼───────────────────────┼────────┤
║ 13 ║                       │      │ 10     │   │                       │ 10     │
╙────╨───────────────────────┴──────┴────────┴───┴───────────────────────┴────────┘

答案 1 :(得分:1)

我能得到的最接近的是:

=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,然后其余为零。

enter image description here

修改

这几乎是随机的,这将允许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)))))

enter image description here

答案 2 :(得分:0)

这是一个随机解决方案。首先,创建一个可能的集合表。鉴于您的约束,只有5种可能的解决方案。我把这个表放在单元格B2:F10中,标题放在第1行。注意,这个表可以放在任何地方,如果愿意,甚至可以放在不同的表格上。在最终产品中,我可能会隐藏这些行。无论如何,它看起来像这样:

ListedSets

接下来,因为你想要一个随机数量的列,在单元格A12中我放入一个名为# of Columns的标题,在单元格B12中是这个公式(随意调整上限和下限到你的#39} ;重新寻找,这只是3到10之间的随机数):=RANDBETWEEN(3,10)

现在我们可以设置我们的随机列以及它们使用的集合:

  • 在单元格B14中并向右复制(到最大列数 在前面的公式中定义,所以在这个例子中它转到K. 因为B:K是10列),使用这个公式:

    =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

你会注意到第三个公式引用了我们尚未构建的范围,在第26:34行中。在该范围内,还有另一个充满随机数的表格,以便集合可以加扰以给我们随机化的结果。构建该表非常容易。在单元格B26中并上下复制到K34(再次,复制到最大列数和向下复制9行),这个公式是这样的:

=IF(B$14="","",RAND())

Randomizers

现在使用随机数发生器,您将获得第二张图像中显示的结果,其中9个数字的随机集合总和为10,包括0,1和2。此时,如果愿意,您可以将Sets和Randomizers表剪切/粘贴到不同的工作表,或者只是隐藏这些行。

答案 3 :(得分:0)

Because of the constraint, there are only 5 unique combinations of values to get to 10:

  • 5 two's; 0 one's ; 4 zero's
  • 4 two's; 2 one's ; 3 zero's
  • 3 two's; 4 one's ; 2 zero's
  • 2 two's; 6 one's ; 1 zero
  • 1 two's; 8 one's ; 0 zero's

We pick one of the five possibilities at random, scramble the elements and stuff the results into a column.

Store the templates in Sheet1 and the output in columns A through Z in sheet Sheet2.

In Sheet1:

enter image description here

The code:

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

Sample Sheet2:

enter image description here