Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Esercizio Simulazione

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    18

    Esercizio Simulazione

    Devo svolgere un esercizio sulla falsariga di un programma che calcola approssimazioni sempre più precise del valore di PIGRECO attraverso la simulazione di lanci casuali di un ago su un foglio di carta a righe. Tale esperimento prende il nome di esperimento dell'ago di Buffon, il quale tizio ipotizzò appunto che il quoziente tra tentativi e successi fosse prossimo a PIGRECO.

    Il programma che devo scrivere invece, pur dovendo ottenere lo stesso risultato, deve simulare il lancio casuale di freccette all'interno di un cerchio (con centro 0, 0 e raggio 1) iscritto nel quadrato di gioco con angoli (-1, -1) e (1, 1).

    Questo è il Simulatore:

    codice:
    public class ArrowSimulator 
    {
        public static void main(String[] args) 
        {
           Arrow a = new Arrow();
           
           for (int i = 1; i <= 1E5; i++)
           {
               a. arrow();
           }
           
           System.out.println((double) a.getTries() / a.getHits());
        }
    }
    Questa è la classe Arrow:
    codice:
    import java.awt.geom.Point2D;
    import java.util.Random;
    
    public class Arrow 
    {
        public Arrow()
        {
            hits = 0;
            tries = 0;
            generator = new Random();
            
        }
        
        public void arrow()
        {
            double x = generator.nextDouble() * 2 - 1;
            double y = generator.nextDouble() * 2 - 1;
            p = new Point2D.Double(x, y);
            if (p.distance(0, 0) <= 1) hits++;
            tries++;
        }
        
        public int getHits()
        {
            return hits;
        }
        
        public int getTries()
        {
            return tries;
        }
        
        private Point2D.Double p;
        private Random generator;
        private int hits;
        private int tries;
    }
    Il problema è che il risultato finale non tende a PIGRECO! Eppure mi sembra che l'esercizio sia logicamente corretto. C'è qualcuno che può aiutarmi? Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Il fatto è che... non tende a PIGRECO: L'area del quadrato (2x2) è 4, l'area del cerchio (di raggio 1) è invece PIGRECO. Il rapporto tra le due aree (cerchio/quadrato), che è anche la proporzione a cui stanno il numero dei tiri che cascano dentro al cerchio sul totale dei tiri tende dunque a PIGRECO/4:

    La convergenza è abbastanza lenta, comunque, converge... basta sistemare la relazione:

    codice:
    Arrow a = new Arrow();
            for (int i = 1; i <= 1E7; i++) {
               a. arrow();           
            }
            System.out.println(((double) a.getHits() / (double)a.getTries())*4);
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    18
    Grazie infinite.

  4. #4
    Considera anche che non esistono (e non possono esistere) algoritmi per generare veri numeri random.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    18
    Certo appunto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.