Я пытаюсь построить и сравнить, как можно быстрее, два случайных вектора 01 одинаковой длины, используя Юлию, каждый вектор с одинаковым количеством нулей и единиц.
Это все для моделирования Монте-Карло следующего вероятностного вопроса
У нас есть две независимые урны, каждая с n белыми шарами и n черными шарами. Затем мы берем пару шаров, по одному на каждую урну, каждый раз, чтобы опустошить урны. Какова вероятность того, что каждая пара имеет один и тот же цвет?
Я сделал следующее:
using Random
# Auxiliar function that compare the parity, element by element, of two
# random vectors of length 2n
function comp(n::Int64)
sum((shuffle!(Vector(1:2*n)) .+ shuffle!(Vector(1:2*n))).%2)
end
Выше генерируются две случайные перестановки вектора от 1 до 2n, добавляется элемент за элементом, применяется модуль 2 к каждому элементу и после суммируются все значения оставшегося вектора. Затем я использую выше четность каждого числа, чтобы смоделировать его цвет: нечетное чёрное и белое чётное.
Если конечная сумма равна нулю, то два случайных вектора имели одинаковые цвета, элемент за элементом. Другой результат говорит о том, что два вектора не имели парных цветов.
Затем я настраиваю следующую функцию, это просто симуляция МонтеКарло с желаемой вероятностью:
# Here m is an optional argument that control the amount of random
# experiments in the simulation
function sim(n::Int64,m::Int64=24)
# A counter for the valid cases
x = 0
for i in 1:2^m
# A random pair of vectors is a valid case if they have the
# the same parity element by element so
if comp(n) == 0
x += 1
end
end
# The estimated value
x/2^m
end
Теперь я хочу знать, есть ли более быстрый способ сравнения таких векторов. Я попробовал следующую альтернативную конструкцию и сравнение для случайных векторов
shuffle!( repeat([0,1],n)) == shuffle!( repeat([0,1],n))
Затем я изменил соответствующий код на
comp(n)
С этими изменениями код работает немного медленнее, что я тестировал с помощью функции @time
. Другими изменениями, которые я сделал, было изменение оператора for
для оператора while
, но время вычисления осталось прежним.
Поскольку я не программист (на самом деле только вчера я изучил что-то из языка Julia и установил интерфейс Juno), то, вероятно, будет более быстрый способ сделать те же вычисления. Некоторые советы будут оценены, потому что эффективность моделирования MonteCarlo зависит от количества случайных экспериментов, поэтому чем быстрее вычисление, тем большие значения мы можем проверить.