У меня странная проблема с созданной мной имитацией Монте-Карло. Это вложенный цикл для расчета ожидаемой стоимости инвестиций (на самом деле турниров по покеру). Для демонстрации предположим, что мы говорим о покерных турнирах один на один, которые равносильны подбрасыванию монеты. Предположим, что у нас есть 25% ROI на подбрасывание монеты, а бай-ин равен единице, поэтому EV после 100 (500, 1000) подбрасываний монеты составляет 25 (125, 250) единиц. Однако симуляция возвращает 24,6, 123,6 и 246 соответственно. Критическая строчка в коде находится здесь:
Randomize
randomnumber = Rnd()
If randomnumber > adjustedITM Then
MC_array(m, n) = -tournamentvariables(k, 6)
Else:
Randomize
MC_array(m, n) = CDec(tournamentstructures(Int(Rnd() * (tournamentvariables(k, 7)) + 1), k) * tournamentvariables(k, 6) * (1 - tournamentvariables(k, 5)) * tournamentvariables(k, 2) - tournamentvariables(k, 6))
End If
Второй MC_array (m, n) - критическая строка кода. Это дает чистую прибыль, если игрок выигрывает. В случае подбрасывания монеты это одна единица. Если я изменю вторую строку на
Randomize
If Rnd() > adjustedITM Then
MC_array(m, n) = -tournamentvariables(k, 6)
Else:
Randomize
MC_array(m, n) = 1
End If
Результаты верные. Код после второго MCarray упрощает подбрасывание монеты:
CDec(tournamentstructures(Int(Rnd() * (tournamentvariables(k, 7)) + 1), k) * tournamentvariables(k, 6) * (1 - tournamentvariables(k, 5)) * tournamentvariables(k, 2) - tournamentvariables(k, 6))
=
CDec(tournamentstructures(1,1) * 1 * (1 - 0%) * 2 - 1)
Так что это точно так же, как один. Массив Tournamentstructures () имеет размер (1,1), поэтому он не может ничего прочитать. Я проверил, что все результаты являются целыми числами (что касается подбрасывания монеты, вы можете выиграть или проиграть только единицу), я сильно подозреваю, что генератор случайных чисел как-то смещен.
Я объявил почти все в коде как вариант и исключил второй случайный выбор без изменения смещения. Итак, ребята, что здесь происходит?