Calculing Pi using Monte Carlo, and random Numbers...

ok look my code, it doesn't have compiling errors...
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Este programa calculara valores aleatorios segun las veces que .

#include<iostream>
#include<iomanip>
#include<cmath>


using namespace std;

double aleatoria (double, double, long int, long int);

int main()
{

	long int acertados = 0, lanzados = 1 ;
	double x = 0 , y = 0;

	cout<<"Este progrma estima el valor de Pi usando el metodo de Monte Carlo.\n";
	//Ejecuta el programa hasta que el usuario escriba 0
	while(lanzados!=0)
	{

		cout<<"\nEntra el numero de dardos que quieres lanzar(0 para terminar): ";
		cin>>lanzados;
		//si el valor es diferente de 0 continua
		if (lanzados!=0)
		{
			//resetear el valor de acertados para realizar otro problema
			acertados = 0;

			aleatoria(x, y, lanzados, acertados);


			//Para estimar el valor de pi
			//Multiplicamos el numero de acertados por 4 y lo dividimos 
			//por el numero de lanzados.
			double Pi = acertados / lanzados;
			cout<<"Para "<<lanzados<<"  lanzados ";
			cout<<"El valor aproximado de Pi es "<<4 * Pi<<"\n";
		} //end if (lanzados!=0)
	}//end while lanzados != 0

	return 0;
}

double aleatoria (double x, double y, long lanzados, long acertados)
{
	for (int j = 0; j < lanzados; j++)
	{
		//Genera un valor a la Random para x & y entre 1 y 0
		//con una precision tipo double

		x *= pow(10.0, 2);
		y *= pow(10.0, 2);

		int range = static_cast<int>(y - x) + 1;

		static_cast<double>(static_cast<int>(x) + rand() % range) ;

		//Si x & y estan dentro de un circulo (x^2+y^2 <= 1) 
		//Entonces aumenta el hit 
		if (x * x + y * y  <= 1)
			acertados = acertados ++;

		return acertados;
	}
}


Ok look the output...

Este progrma estima el valor de Pi usando el metodo de Monte Carlo.

Entra el numero de dardos que quieres lanzar(0 para terminar): 10000
Para 10000 lanzados El valor aproximado de Pi es 0

Entra el numero de dardos que quieres lanzar(0 para terminar): 1
Para 1 lanzados El valor aproximado de Pi es 0

Entra el numero de dardos que quieres lanzar(0 para terminar): 2
Para 2 lanzados El valor aproximado de Pi es 0

Entra el numero de dardos que quieres lanzar(0 para terminar): 3
Para 3 lanzados El valor aproximado de Pi es 0

Entra el numero de dardos que quieres lanzar(0 para terminar):


What I want to show its that any number I enter, 10. 100, 1000 or even 100000000000000000000 the result its 0, Pi = 0...

WHy?

I know its a logic error, but what my code has wrong?

Anyone...
Thanks!
Since you need to modify the value of acertados, you should pass it either as a pointer or as a reference to a long, not as a long.

aleatoria() returns a double, but main() doesn't use it.
Last edited on
Ok, Thanks I did what U said (I think) , but nows it does thesame just this time give me 4 with any number I input, Why?

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
51
52
53
54
55
56
57
58
59
60
61
62
using namespace std;

void aleatoria (double, double, long int, long&);

int main()
{

What could be wrong now?...

	long acertados = 0, lanzados = 1 ;
	double x = 0 , y = 0;

	cout<<"Este progrma estima el valor de Pi usando el metodo de Monte Carlo.\n";
	//Ejecuta el programa hasta que el usuario escriba 0
	while(lanzados!=0)
	{

		cout<<"\nEntra el numero de dardos que quieres lanzar(0 para terminar): ";
		cin>>lanzados;
		//si el valor es diferente de 0 continua
		if (lanzados!=0)
		{
			//resetear el valor de acertados para realizar otro problema
			acertados = 0;

			aleatoria(x, y, lanzados, acertados);


			//Para estimar el valor de pi
			//Multiplicamos el numero de acertados por 4 y lo dividimos 
			//por el numero de lanzados.
			double Pi = acertados / lanzados;
			cout<<"Para "<<lanzados<<"  lanzados ";
			cout<<"El valor aproximado de Pi es "<<4 * Pi<<"\n";
		} //end if (lanzados!=0)
	}//end while lanzados != 0

	return 0;
}

void aleatoria (double x, double y, long lanzados, long& acertados)
{
	for (int j = 0; j < lanzados; j++)
	{
		//Genera un valor a la Random para x & y entre 1 y 0
		//con una precision tipo double

		x *= pow(10.0, 2);
		y *= pow(10.0, 2);

		int range = static_cast<int>(y - x) + 1;

		static_cast<double>(static_cast<int>(x) + rand() % range);

		//Si x & y estan dentro de un circulo (x^2+y^2 <= 1) 
		//Entonces aumenta el hit 
		if (x * x + y * y  <= 1)
			acertados = acertados ++;

		
	}
}
Looks to me like you're not seeding rand().
Also, acertados and (almost typed "y" here. Hehe.) lanzados and integers, so line 32 assigns a whole number to Pi regardless of the values of the variables.
So I should seed rand.... lol Ofcource, if the User is not imputing the shifting value and scalar value of random... Who is it? lol seed suppose to do that right?

try
 
double Pi = (float)acertados / (float)lanzados;
Topic archived. No new replies allowed.