Во всех примерах кодов Монте-Карло, которые я нашел, которые вычисляют число пи, и x, и y генерируются случайным образом между 0 и 1. Например, пример кода выглядит так:
Ran rdm(time(NULL));
double x, y;
int sum=0;
for(int i=0;i<N;i++)
{
x=rdm.doub(); // Both x and y are generated randomly
y=rdm.doub();
if(x*x+y*y<1)
sum++;
}
return 4.*sum/N;
Я не понимаю, какой смысл случайным образом генерировать обе оси, а не выбирать фиксированный и унифицированный список x, а затем генерировать только y случайным образом, как в примере кода ниже.
Ran rdm(time(NULL));
double x=0.5/N, dx=1./N, y; //x is a fixed sequential list
int sum=0;
for(int i=0;i<N;i++)
{
y=rdm.doub(); // only y is generated randomly
if(x*x+y*y<1)
sum++;
x+=dx;
}
return 4.*sum/N;
Я пробовал оба примера. Оба метода сходятся со скоростью ~ 1/sqrt(N). Ошибка второго метода немного меньше, а второй код работает немного быстрее. Так что мне кажется, что второй способ лучше. А для выборки в пространстве более высокого измерения, я думаю, всегда можно выбрать фиксированный список в одном измерении и случайную выборку в других измерениях. Это правда?
Есть ли какая-либо ссылка, которая может доказать, что метод фиксированного x также верен?
Если фиксированный метод x лучше, почему я никогда не видел ни одного примера кода, написанного таким образом? Связано ли это с выборкой адаптивной важности?