2015-04-04 3 views
1

Я хотел бы сделать симуляцию в Excel 1000 раз, а затем подытожить количество успехов для каждого испытания. Я хотел бы изменить размер пробной версии для запуска.Сумма, основанная на значении в массиве

Например, у меня есть 1000 номеров в диапазоне от 0 - 31 в столбце Excel. Допустим, что первые три цифры: 28, 31, 27. Для первого запуска я хотел бы запустить генератор случайных чисел 28 раз, а затем суммировать, сколько из значений меньше .277. Следующий столбец будет иметь 31 проб, а следующий будет 27 и так далее, пока все 1000 номеров не будут использоваться по порядку.

Это то, что я до сих пор:

Private Sub CommandButton1_Click() 
Dim i As Long 
Dim j As Long 
For i = 1 To 1001 
For j = 1 To iCol.Value 
    Range("A" & j) = Rnd() 
    If Cells(j, 1).Value < 0.277 Then 
    Cells(j, i) = 1 
    Else 
    Cells(j, i) = 0 
    End If 
Next j 
Next i 
End Sub 

Проблемы я имею с For j = 1 To iCol.Value. Если бы это было заданное число i, то сделало бы j = 1 to 34, но я хочу, чтобы он менялся при каждом прогоне на основе значений в другом столбце.

ответ

0

Вы близко! Если я это понимаю, вы хотите провести серию тестов 1000 раз. Каждая серия может быть 0-31 циклов одного и того же теста, и у вас есть счетчики циклов, хранящиеся в столбце. Похоже, что вы планируете использовать другой лист, чтобы хранить все случайные числа в одном столбце, а результаты - в остальном. Это много столбцов!

Если вам действительно не нужно хранить все эти длинные сроки 1 и 0, вы можете использовать другую переменную для подсчета и пропустить запись значений в ячейку до тех пор, пока не получите результат ... количество раз утверждение верно.

Вы могли бы сделать что-то вроде этого (вы, возможно, придется изменить ссылку или два, так как я не могу видеть ваше учебное пособие)

Private Sub CommandButton1_Click() 

Dim i As Long 
Dim j As Long 
'Some new variables/objects 
Dim lCurrentCount As Long 
Dim iCol 
Dim ws As Worksheet 

'Set this to the source sheet (where your trial counts are) 
Set ws = ActiveWorkbook.Sheets(2) 

'This will be used to keep track of how many times the test 
'was true without using the cells/columns to store data 
lCurrentCount = 0 

For i = 1 To 1000 
'This is what will incriment you to the next row to get a new trial count 
iCol = ws.Cells(i, 1) 
    For j = 1 To iCol 
     If Rnd() < 0.277 Then 
      'If it's true, add one to the current count 
      'If not go to the next 
      lCurrentCount = lCurrentCount + 1 
     End If 
     If j = iCol Then 
      'If this is the last one in a trial, put the 
      'True count next to the cycle number 
      Range("B" & i) = lCurrentCount 
      lCurrentCount = 0 
     End If 
    Next j 
Next i 

End Sub 

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

Private Sub CommandButton1_Click() 
Dim i As Long 
Dim j As Long 

'Some new variables/objects 
Dim iCol As Long 
Dim wsSource As Worksheet 
Dim wsTarget As Worksheet 

'Set this to the source sheet (where your trial counts are) 
Set wsSource = ActiveWorkbook.Sheets(2) 
'Set this to the target sheet (where your trial Results will go) 
Set wsTarget = ActiveWorkbook.Sheets(1) 

For i = 1 To 100 
'This is what will incriment you to the next row to get a new trial count 
'Using i in the cells reference to what I assume is another sheet 
iCol = wsSource.Cells(i, 1) 
For j = 1 To iCol 
    wsTarget.Range("A" & j) = Rnd() 
    If wsTarget.Cells(j, 1).Value < 0.277 Then 
    wsTarget.Cells(j, i) = 1 
    Else 
    wsTarget.Cells(j, i) = 0 
    End If 
Next j 
Next i 
End Sub 

Похож на какую-то забавную науку, надеюсь, что это поможет!

+0

Это сработало так хорошо! –

+0

Рад помочь. У вас было хорошее начало, просто отсутствовали эти последние две части. Удачи! –

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