Форум программистов, компьютерный форум CyberForum.ru

Вычисление числа Пи методом Монте-Карло - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Новичок программировании GUI приложений http://www.cyberforum.ru/cpp-beginners/thread688922.html
Здравствуйте. Посоветуйте, что лучше для начинающего в программировании GUI приложений, изучать библиотеки (WinAPI или т.п) или программирование в RAD системе?
C++ Изменение значения private поля в c++ При желании такое можно провернуть в c# (ну только естественно не на уровне объекта). Поэтому и возник такой вопрос. Ощущение что подобное возможно только в дин. языках. В общем быстрый гуглинг ничего не дал. http://www.cyberforum.ru/cpp-beginners/thread688620.html
Сборка библиотеки и ошибка "fatal error LNK1149: имя выходного файла совпадает с именем входного файла" C++
при сборке библиотеки возникает такая ошибка LINK : fatal error LNK1149: имя выходного файла совпадает с именем входного файла, объясните что не так.
Выписать четные биты C++
Рассматривая исходный файл как последовательность битов, записать в новый файл только четные биты (должна получиться последовательность из нулей и единиц). Вот здесь код записи в файл, и перевода в двоичную систему, вот только не знаю, как выписать четные биты: #include "stdafx.h" #include "file.h" using namespace std; FILE *f1,*f2; Chetnie::Chetnie()//инициализация переменных {
C++ Программирование неуправляемого кода для 64 разрядных систем Windows http://www.cyberforum.ru/cpp-beginners/thread688113.html
Долго мучился. Код начал работать, когда я применил типы Uint32 и UintPtr. Причем UintPtr пришлось применять для всех указателей, где раньше я применял Int32. Может быть есть у кого еще опыт?
C++ Ввод только букв и цифр возможно ли в данном случае разрешить ввод цифр тоже? и правильно ли я понимаю, что isdigit() здесь не уместен? do{ cout<<"Enter word:"<<endl; cin>>word; }while(!isAlphaString(word)); cout<<"you entered: "<<endl; cout<<word<<endl; сама функция, для проверки слова bool isAlphaString (std::string &str) подробнее

Показать сообщение отдельно
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
05.11.2012, 13:09     Вычисление числа Пи методом Монте-Карло
Всем доброго время суток. Написать программу для вычисления значения http://www.cyberforum.ru/cgi-bin/latex.cgi?\pi с помощью метода Монте-Карло. Для этого рассмотреть квадрат с центром в начале координат и длиной ребра 2, в которой вписана окружность радиуса 1 с центром в начале координат. Вероятность того, что выбранная наугад точка внутри квадрата попадет внутрь окружности равна отношению площадей окружности и квадрата, то есть http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi }{4}. Площадь квадрата накрывается сеткой из равноотстоящих точек (чем выше плотность точек, тем выше точность вычисления http://www.cyberforum.ru/cgi-bin/latex.cgi?\pi). Отношение точек, попавших внутрь окружности, к общему числу точек стремится (при увеличении общего количества точек к бесконечности) к вероятности попадания случайной точки внутри окружности, то есть http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi }{4}. Если координаты точки x и y
( -1 < x < 1 и -1 < y < 1), то условие попадания точки внутрь окружности имеет вид
http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{2} + {y}^{2} < 1.

Суть расчета заключается в том, что мы берем квадрат со стороной a = 2 R, вписываем в него круг радиусом R. И начинаем наугад ставить точки внутри квадрата. Геометрически, вероятность P1 того, что точка попадет в круг, равна отношению площадей круга и квадрата:
P1=Sкруг / Sквадрата = Pi*R2 / a 2 = Pi*R2 / (2 R ) 2= Pi*R2 / (2 R) 2 = Pi / 4 (1)
Вероятность попадания точки в круг можно также посчитать после численного эксперимента: посчитать количество точек, попавших в круг, и поделить их на общее количество поставленных точек:
P2=Nпопавших в круг / Nточек; (2)
Так, при большом количестве точек в численном эксперименте вероятности должны вести себя cледующим образом:
lim(Nточек→∞)/(P2-P1)=0; (3)
Следовательно:
Pi/ 4 = Nпопавших в круг / Nточек; (4)
Pi=4 * Nпопавших в круг / Nточек; (5)
При моделировании мы применяем псевдослучайные числа, которые не являются случайным процессом.
Вот сам код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<cstdio> 
#include<cmath>
#include <ctime>
#include<cstdlib> 
#include <cstdio>
#define limit_Nmax 1e7 //Максимальное количество точек
#define limit_a 1e6 //Максмиальный радиус круга
#define min_a 100 //Начальный радиус
 
double circle(double, double); //Выдает квадрат Y в зависимости от координаты Х и радиуса круга.
 
int main() 
{ 
 
double x,y,Pi; 
long long int a=min_a;//сторона квадрата
int i=0;//Счетчик 
double Ncirc=0;//Количество точек, попавших в круг 
double Nmax=a; //Общее количество точек
while (a<limit_a)  //Перебор  значений радиуса
{ 
Nmax=a; 
 while (Nmax<=limit_Nmax) // Перебор значения количества точек
 { 
 Ncirc=0; i=0; //обнуляторы
    while (i<Nmax) 
    { 
    x = (rand() % (a * 1000))/1000;  //Рандомный Х с 3 знаками после запятой
    y = (rand() % (a * 1000))/1000;  //Рандомный Y с 3 знаками после запятой
        if (y*y<=circle(x,(a/2)))  //Условие принадлежности точки к кругу
        { 
        Ncirc++; 
        } 
    i++; 
    } 
 
 Pi=(Ncirc/Nmax)*4; 
 Nmax *= 2; 
 printf("\n%lld, %.0f, %f",a,Nmax,Pi); 
 } 
a*=2; 
} 
 
} 
 
double circle(double x, double radius) 
{ 
double y=radius*radius-x*x; 
return y; 
}
Но она не правильно считает число Pi. Подскажите пожалуйста в чем ошибка???? Заранее огромное спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru