Logo de Beunicoos

Leandro

Hola. Estaba intentando hacer la aproximación al número pi mediante el método de Montecarlo, pero me sale que se aproxima a 2 para un valor de N del orden de 10 elevado a 5.

Este es el programa, espero que puedan decirme qué debo arreglar para que me salga bien. Muchas gracias.

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

int main (void) {

    double x, y, d, pi;

    int i, j, N, r;

    printf ("Calcular pi mediante el método de Montecarlo\n");

    j = 0;

    N = 100000;

    for (i = 1; i <= N; i = i + 1) {

      x = rand ();

      y = rand ();

      printf ("Punto: %f, %f\n", x , y);

      d = sqrt ((x - r) * (x - r) - (y - r) * (y - r));

    if (d < r) {

      j = j + 1;

      printf ("Cae adentro\n");

    }

    }

    printf ("Puntos que caen: %d\n", j);

    pi = (double) ( j/(1.0 * N))/ (0.5 * 0.5);

    printf ("Valor de pi estimado por Montecarlo: %f\n", pi);

    return 0;

}

Respuestas (3)

Ya hace que no utilizo el compilador C, pero tal vez te pueda servir de algo lo siguiente: 

En el código que muestras, utilizas la variable r sin antes darle un valor.

Te sugiero lo siguiente: 

- Definir el radio como 1 (r = 1;)

- Eliminar la sentencia printf ("Punto: %f, %f\n", x , y); porque se lleva mucho tiempo imprimiendo eso y no te hace falta.

- Cuando das valores aleatorios, haz que estos estén entre el 0 y el 1. Ahora al no decirle nada, asigna numeros enormes.

- Cambiar       

d = sqrt ((x - r) * (x - r) - (y - r) * (y - r));

    if (d < r) {

      j = j + 1;

}

Por:

d = x*x + y*y;

if (d <= r) {

j = j + 1;

}

De esta forma, en d buscas el sitio del punto y luego miras si esta distancia es menor al radio para afirmar que está dentro.

En este enlace está el programa en C++: https://programacion1z.wordpress.com/2019/11/08/9524/

En este enlace puedes ver como generar números aleatorios entre el 0 y el 1: Enlace.

Si no me equivoco el compilador C no puede dividir o multiplicar números enteros con flotantes. Habrá que tener eso en cuenta.

Hola. Muchas gracias por tu ayuda. Me quedó así el programa, no sé si tendrá algún fallo más que veas, pero me da como valor aproximado 2.99.

#include <stdio.h>

#include <math.h>

int main (void) {

    double x, y, d, pi;

    int i, j, N;

    int r = 1;

    printf ("Calcular pi mediante Montecarlo\n");

    j = 0;

    N = 100000;

    for (i = 1; i <= N; i = i + 1) {

      x = rand () % 2;

      y = rand () % 2;

      d = x * x + y * y;

    if (d <= r) {

      j = j + 1;

        }

    }

    printf ("Puntos que caen: %d\n", j);

    pi = (double) ( j/(1.0 * N)) / ( 0.5 * 0.5);

    printf ("Valor de pi estimado por Montecarlo: %f\n", pi);

    return 0;

}

The HP HPE0-V25 Pass Results refer to the outcomes of the HPE0-V25 certification exam, which is offered by Hewlett Packard Enterprise (HPE). The https://www.dumpstool.com/HPE0-V25-exam.html Pass Results indicate whether a candidate has successfully passed the exam and earned their HPE0-V25 certification. Achieving a positive pass result demonstrates a candidate's proficiency in HPE's technical solutions and validates their expertise in areas such as design, deployment, and management of HPE infrastructure and systems. This certification is valuable for IT professionals and organizations seeking to ensure the proficiency of their technical staff in HPE technologies.