2017-03-21 2 views
0

Ich versuche, eine Monte Carlo Simulation zu replizieren, indem Sie das Verhältnis von Quadrat gegen Kreis, wenn ein zufällig generierter Punkt von x und y zwischen -1 und 1 gegeben ist. Ich habe ein Problem Generieren von Zufallszahlen für x und y, da sie denselben Wert für jede Schleife zurückgeben.math.random in loop erzeugt die gleiche Nummer

import java.util.Scanner; 

public class monte 
{ 
    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 
     int loop_n = input.nextInt(); 

     //true false switch for the while loop 
     boolean t_f = true; 

     int count = 0;     //counts how many iterations until inside the circle 
     double radius = 0;    //calculates the pythagoras c from x, y coordinates 
     double x = 0, y = 0; 

     int i; 
     for (i = 0; i < loop_n; i++) 
     { 

      while(t_f)     //while loop to see if the c from x,y coordinates is smaller than 1 
      { 
       x = -1 + (Math.random() * (2)); 
       y = -1 + (Math.random() * (2)); 
       radius = Math.pow((Math.pow(x, 2.0)) + Math.pow(y, 2.0), 0.5); 

       if (radius < 1)   //terminates while loop if radius is smaller than 1 
       {      //thus being inside the circle 
        t_f = false; 
       } 
       count++; 
      } 
      System.out.println("" + radius); 
      System.out.println("" + count); 
     } 
    } 
} 

Ergebnis von cmd:

result from cmd

Gibt es eine bestimmte Regel mit Math.random innerhalb von Schleifen? Oder schreibe ich meinen Code falsch?

+3

sollten Sie wahrscheinlich 't_f = true;' außerhalb der While-Schleife erneut setzen. – luk2302

Antwort

1

Ich bezweifle, dass die Math.random() falsch funktioniert. Ihre Schleifenlogik ist einfach ausgeschaltet. Sobald Sie t_f = false; einmal einstellen, drucken Sie immer den gleichen Radius, weil Sie nie wieder die while Schleife eingeben. Sie sollten daher Ihren Code ändern, um t_f = true; nach dem Drucken radius und count zu setzen.

Oder lassen Sie einfach die t_f vollständig und verwenden Sie stattdessen eine break;.

0

Sie setzen t_f auf false und nur Iteration mit i = 0 tut tatsächlich etwas. Alle anderen Iterationen drucken nur Radius und Anzahl, die unverändert bleiben. Ich nehme an, Sie wollten t_f vor der while (t_f) Schleife auf true setzen.

+0

danke! Ich wusste, dass ich etwas Seltsames machte. –

Verwandte Themen