2017-08-30 2 views
0

Ich habe versucht, ein in Javascript ein Geburtstags Paradox Ereignis für 23 Studenten zu tun, sollte es mir eine durchschnittliche Wahrscheinlichkeit von 51% geben, aber es gibt mir immer rund 67%. Hier der Code:Mein Geburtstag Paradox Event Simulator in Javascript funktioniert nicht gut

var pers = []; 
var D = 0; 
for (var i = 0; i < 10000; i++) { 
    for (var k = 0; k < 23; k++) { 
     pers.push(Math.floor((Math.random()*366) + 1)); 
    } 
    var npers = pers.slice(); 
    npers.sort(); 
    for (var v = 0; v < npers.length; v++) { 
     if (npers[v-1] == npers[v]) { 
      D++; 
     } 
    } 
    pers = []; 
} 
D = D/100; 
var DD = D.toString(); 
DD = DD + "%"; 
document.write(DD); 

Könnten Sie mir bitte sagen, wo ich einen Fehler begangen habe? Vielen Dank. Ich bin mir sicher, dass ich einen Fehler begangen habe, denn der niedrigste Prozentsatz, den ich bekommen habe, war 66%, also weit über dem Ziel von 51%. (Ich habe es mehrmals ausgeführt). Nochmals vielen Dank für deine Hilfe, es ist Stunden her, dass ich versuche herauszufinden, was ich falsch gemacht habe, aber ich verstehe es nicht.

Antwort

1

Sie zählen die Anzahl der alle Zufälle, nicht die Zahl der Fälle, in denen mindestens ein Zufall im Raum sind. Das heißt, wenn es auf einem gegebenen Set beispielsweise drei Personen gibt, die einen Geburtstag teilen, oder zwei Paare, die Geburtstage teilen, erhöhen Sie zweimal die Anzahl D.

Fügen Sie eine break; nach D++; hinzu und Sie erhalten Zahlen um 50%.

By the way, Ihre v Schleife underindexes npers (bei v=0 Sie npers[-1] gegen npers[0] vergleichen) - aber das hat keinen Einfluss auf das Ergebnis.

+0

Vielen Dank, es hat es gelöst. –

0

Das Problem ist mit diesen for-Schleife

for (var v = 0; v < npers.length; v++) { 
    if (npers[v-1] == npers[v]) { 
     D++; 
    } 
} 

Dies erhöht D wird (die Anzahl der Erfolge) für jedes Paar in einem Versuch statt erhöhen sie nur ein einziges Mal, wenn Sie ein Paar finden. Sie interessieren sich nur für die Existenz eines Paares. Das Einfügen eines break; nach D++; sollte dies lösen.

-1
var pers = []; 
var D = 0; 
for (var i = 0; i < 10000; i++) { 
    for (var k = 0; k < 23; k++) { 
     pers.push(Math.floor((Math.random()*366) + 1)); 
    } 
    var npers = pers.slice(); 
    npers.sort(); 
    for (var v = 1; v < npers.length; v++) {//start from 1 
     if (npers[v-1] == npers[v]) { 
      D++; 
      break;// to avoid counting when there are more than 2 persons 
    //having the same birthday. It should count as 1. 
     } 
    } 
    pers = []; 
} 

D = D/100; 
var DD = D.toString(); 
DD = DD + "%"; 
document.write(DD); 
Verwandte Themen