Монте-Карло и Площадь-Расчет

1

Он должен быть близок к 0,3

$ cat monte.py 
import random,math
density=int(1e6)
x = [random.uniform(0,1)*7*math.pi for _ in range(density)]
y = [random.uniform(0,1) for _ in range(density)]
i = [math.sin(xx)*math.cos(xx) > yy for (xx,yy) in zip(x,y)]

print sum(i)/(float(density)*10.0)*7*math.pi

$ python monte.py 
0.350184850795

Я пытаюсь переписать ниже, но по какой-то причине код python даже не близок.

x = rand(1, 1000000)*7pi;
y = rand(1, 1000000);
i = sin(x).* cos(x) >y;
Area3 = (sum(i) / 10000000)*7pi;
  • 0
    Ну, во-первых, вы 1e7 на 1e7 в версии Matlab и 1e6 в версии Python ...
  • 0
    @JoeKington: Нет, смотри внимательно ... (float (плотность) * 10.0) = 1e7
Показать ещё 1 комментарий
Теги:

1 ответ

2
Лучший ответ

Я получаю одинаковые результаты между версиями matlab и python... Вы уверены, что версия matlab дает вам ~ 2, а не ~ 0.35?

Например:

MATLAB:

x = rand(1, 1000000)*7*pi;
y = rand(1, 1000000);
i = sin(x).* cos(x) >y;
Area3 = (sum(i) / 10000000)*7*pi

Это дает: 0.3511

Версия вашего чистого python:

import random,math
density=int(1e6)
x = [random.uniform(0,1)*7*math.pi for _ in range(density)]
y = [random.uniform(0,1) for _ in range(density)]
i = [math.sin(xx)*math.cos(xx) > yy for (xx,yy) in zip(x,y)]

print sum(i)/(float(density)*10.0)*7*math.pi

Это дает: 0.347935156296

Numpy основе:

import numpy as np
x = np.random.random(1e6) * 7 * np.pi
y = np.random.random(x.size)
i = np.sin(x) * np.cos(x) > y
print 7 * np.pi * i.sum() / (10 * x.size)

Это дает: 0.350475133957

  • 0
    да, это правильно, принято из-за отличного решения NumPy! Я знал, что заново изобретаю странное колесо, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню