2016-07-08 16 views
0

Der folgende Code soll zufälligen Tag des Jahres generieren, und alle 2 Personen, die gleichen Geburtstag haben übereinstimmen. Dies ist bekannt als Geburtstagsproblem. Der Code funktioniert, aber die Ausgabe ist falsch.Geburtstagswahrscheinlichkeit: falsche Ausgabe

public double simulate(int size, int count) { 

    Random random = new Random(); 

    double x[] = new double[size]; 

    double matches = 0; 

    boolean isMatch = false; 

    random.setSeed(count); 

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

     for (int j = 0; j < size; j++) { 

      x[j] = random.nextInt(365); 

      for (int k = j + 1; k < size; k++) { 

       if (x[j] == x[k]) { 

        matches++; 

        isMatch = true; 

        break; 
       } 
      } 
      if (isMatch) { 

       isMatch = false; 
       break; 
      } 
     } 
    } 
    return (matches/count)*100; 
} 

und hier ist die erwartete Ausgabe Ergebnis

simulate(number of people,number of simulation) 
simulate(5, 10000) output = 2.71 
simulate(7, 5000) output = 5.34 
simulate(2, 10000) output = 0.27 
simulate(9, 10000) output = 9.47 
simulate(30, 20000) output = 70.675 
simulate(15, 50000) output = 25.576 
simulate(35, 50000) output = 81.434 
simulate(45, 50000) output = 94.2 

und das, was tatsächliche Ausgang:

 simulate(5, 10000) output = 2.54 
    simulate(7, 5000) output = 5.64 
    simulate(2, 10000) output = 0.18 
    simulate(9, 10000) output = 9.05 
    simulate(30, 20000) output = 68.98 
    simulate(15, 50000) output = 25.12 
    simulate(35, 50000) output = 79.90 
    simulate(45, 50000) output = 92.99 

Dank für Ihre Zeit.

+0

Warum verwenden Sie 'doubles' in' double x [] = new double [size]; Doppeltreffer = 0; '? –

+4

Okay, versuchen Sie herauszufinden, was eine "Simulation" ist. Wenn Sie eine Simulation mit einem Zufallsgenerator durchführen, erhalten Sie nicht genau die gleichen Ergebnisse wie ein erwarteter Wert. Wenn Sie genügend Stichproben verwenden, wird das Ergebnis geschlossen. In Ihrem Fall liegen die Ergebnisse alle nahe bei Ihren erwarteten Werten. Ihr Programm scheint also gut zu funktionieren. –

+0

@ScaryWombat Größe ist die Anzahl der Personen und Übereinstimmungen werden jedes Mal erhöht, wenn 2 Werte mit –

Antwort

1

Es gibt ein großes Problem in Ihrem Code. Sie initialisieren das Array x mit zufälligen Daten, aber bevor Sie es vollständig initialisiert haben, überprüfen Sie bereits, ob es zwei Werte gibt, die gleich sind. Zu diesem Zeitpunkt ist das Ende des Arrays noch nicht vollständig initialisiert. Ändern Sie das zu:

 // First fully filly the array x with values 
     for (int j = 0; j < size; j++) { 
      x[j] = random.nextInt(365); 
     } 

     // And then go checking for duplicates 
     for (int j = 0; j < size; j++) { 
      // etc. 

Danach werden Ihre Ergebnisse näher an der erwarteten Ausgabe sein, aber immer noch nicht genau das gleiche. Das könnte etwas mit dem genauen Wert für den Zufallssamen zu tun haben.

+0

ja ist es jetzt näher, ohne den Samen kann ich den erwarteten Wert aber erst nach ein paar Versuchen erhalten, danke. –