2016-06-10 2 views
1

Я хочу создать несколько случайных столбцов в Excel с этими характеристиками:Случайные числа из определенного диапазона с фиксированной суммой в Excel

  • Каждая колонка имеет 9 ячеек
  • Каждая клетка является либо 0, 1, или 2
  • Каждый столбец имеет СУММА = 10

Я попытался создать 9 случайных чисел в колонке а, а затем использовать ROUND(B1/SUM(B$1:B$9);1)*10 для столбцов, но из-за КРУГЛОЕ (я думаю), это не совсем правильно, поскольку не все столбцы имеют сумма = 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
+0

@ 8odoros - Будет ли разрешено использование листов Google? Там есть некоторые дополнительные функции, которые не находятся в Excell – user3616725

+0

. Думаю, лучший дизайн для этого был бы циклом while, который генерирует список целых чисел {0,1,2}, а затем смотрит на последние 9 чисел, чтобы увидеть, их сумма равна 10. Да, этот цикл теоретически не связан и может работать вечно, но статистически я бы поставил, что он решает в течение первых 100 итераций каждый раз. Это не позволяет вам вручную создавать списки наборов, как в большинстве приведенных ниже примеров. –

ответ

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 s случайно:

=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

+0

Я думал по тем же строкам, но это означает, что в нижних строках больше шансов иметь 0 (не по-настоящему случайный). Кроме того, все еще МОЖНО иметь в общей сложности меньше 10, если все ячейки равны 0 (возможно, но статистически маловероятно) – user3616725

+0

@ user3616725 Вы правы, что это не истинный случайный, но он всегда будет = 10. Посмотрите на мой RANDBETWEEN(), это 1 или 2, нет 0. Это был единственный способ гарантировать, что 10 всегда было достигнуто. Даже если это закончится со всеми 1 в первых 8, IF поместит 2 в последнем месте, таким образом сделав это 10. Единственный способ получить истинное случайное было бы включать vba, загружать результаты в массив, а затем смешивать массив. Затем отправьте значения обратно. Тогда это будет статично. –

+0

Это далеко не идеальный (например, последний ряд почти никогда не был 2), но я согласен.Другие ответы тоже хороши, но менее случайны и слишком полагаются на то, что в этом конкретном случае существует только 5 вариантов (без учета порядка). Так что ** в моем случае ** это лучший ответ. –

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)
  • Использование ИНДЕКС для ссылки на ячейку в произвольно выбранной колонке (1-5) и случайным образом упорядоченного ряда (1-9), из области допустимых значений 9x5. например: в ячейке 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  │ 
╙────╨───────────────────────┴──────┴────────┴───┴───────────────────────┴────────┘ 
0

Вот рандомизированное решение для Вас. Сначала создайте таблицу возможных множеств. Учитывая ваши ограничения, существует только 5 возможных наборов решений. Я помещаю эту таблицу в ячейки B2: F10, с заголовками в строке 1. Обратите внимание, что эта таблица может идти куда угодно, даже на другом листе, если это необходимо. В конечном продукте я, вероятно, скрою эти строки.Во всяком случае, это выглядит следующим образом:

ListedSets

Далее, потому что вы хотите случайное число столбцов, в ячейке А12 я ставлю в заголовке под названием # of Columns и в ячейке В12 эта формула (не стесняйтесь корректировать верхние и нижние границы к тому, что вы ищете, это просто случайное число в диапазоне от 3 и 10): =RANDBETWEEN(3,10)

Теперь мы можем установить наши рандомизированные колонки и то, что отличает их использовать:

  • В ячейки В14 и копируется вправо (до максимального числа столбцов , определенных в предыдущей формуле, так что в этом примере он идет к K , потому что Б: К 10 столбцов), используют следующую формулу:

    =IF(COLUMN(A14)>$B$12,"","Column "&COLUMN(A14))

  • в ячейке B15 и копируется право является эта формула:

    =IF(B14="","",INDEX($B$1:$F$1,,RANDBETWEEN(1,5)))

  • в ячейке B16 и копируется вправо и вниз, в течение 9 строк (так в этом примере копируется в K24) это FORMUL а:

    =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, состоящими из 0s, 1s и 2s. На этом этапе вы можете вырезать/вставить таблицы Sets и Randomizers на другой лист, если это необходимо, или просто скрыть эти строки.

0

Из-за ограничений, есть только 5 уникальных комбинаций значений, чтобы добраться до 10:

  • два-х; свой; 0's
  • two's; свой; zero's
  • two's; свой; zero's
  • two's; свой; ноль
  • two's; свой; нули

Мы выбираем один из пяти возможностей вкось, карабкаться элементы и прочим результатов в колонку.

Хранить шаблоны в Лист1 и выход в колонках через Z в листе Sheet2.

В Лист1:

enter image description here

Код:

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 

Образец Sheet2:

enter image description here

Смежные вопросы