Метод Монте-Карло в R

Я пытаюсь изучить R. Я пытаюсь написать программу, которая вычисляет (приблизительно) число пи. Подробнее о методе

Мой код сейчас не работает!

f <- 0
s <- 0
range <- 10000
for (i in (1:range)) {
    v <- sample(1:range, 1)/range
    n <- sample(1:range, 1)/range

    if ( sqrt (v*v + n*n) <= 1) {
        f <- f + 1
    } else if ( v <=1 && n <= 1) {
        s <- s+1
    }
}

print ( f/s )

person ניתאי דרעי    schedule 12.11.2018    source источник
comment
В данном коде f попадает внутрь круга, а s попадает вне круга из-за оператора else if. Следовательно, результаты для f/s кажутся (пи/4)/(1-пи/4) = 3,6597... Если вы замените else if только if, то результат будет (пи/4)/1, и после умножения на четыре вы получите 4 * (пи / 4) = пи.   -  person Heikki    schedule 13.11.2018
comment
... на самом деле, вы также можете удалить if( v <= 1 && n <= 1), потому что sample(1:range, 1)/range всегда находится между 1/range и 1. Чтобы соответствовать методу Википедии, вам понадобится sample(0:range, 1)/range, хотя на практике (большие значения range) это не имеет значения много   -  person akraf    schedule 13.11.2018
comment
Наконец, ваш код подходит для первых шагов в R, но обратите внимание, что R не похож на C или Java в том, что вам нужны циклы для всего. В большинстве случаев вы можете изменять целые векторы сразу, что быстрее и, что более важно, короче (меньше ошибок). Решение @mickey показывает это. Например, он сравнивает целый числовой вектор с 1, что дает логический вектор. sum затем просто подсчитывает TRUE в этом векторе. Со временем я бы порекомендовал вам пройти через R Inferno. Например, вы бы сгорели в Circle 3 (не удалось векторизовать) ;-)   -  person akraf    schedule 13.11.2018


Ответы (1)


Вот улучшенная версия вашего кода

range = 100000
v = runif(range)
n = runif(range)
f = sum(sqrt(v^2 + n^2) <= 1)

print(4 * f / range)

Вы должны использовать runif для получения образцов из униформы вместо sample(...) / range.

s не нужен, поскольку вы подсчитываете количество раз, f, когда ваша случайная точка (v,n) находится внутри круга в этом квадранте, деленное на количество попыток розыгрыша, которое в вашем случае будет просто range.

Вам нужно умножить на 4, так как f / range приблизительно соответствует площади одной четверти единичного круга.

person mickey    schedule 12.11.2018