2016-03-22 6 views
0

Ich habe ein bisschen Probleme mit einem Teil meines Codes. Wir haben einen Zufallsgenerator innerhalb einer Schleife, der 1.000.000 Zufallszahlen generiert. Danach müssen wir einen Zähler haben, der den längsten Streifen von Evens und Odds zählt und ihn mit 1/37 * (n-1) (Anzahl der erwarteten Wiederholungen) und (1/37)^2 * (n-1) vergleicht) (Anzahl der erwarteten drei Wiederholungen). Wir haben Arrays nicht gelernt, also erwartet er, dass wir die Aufgabe ohne Arrays abschließen. Es scheint, Streifen richtig zu erzeugen, jedoch sind meine Zahlen konsistent hoch, wenn Sie näher schauen (zum Beispiel erzeuge ich einen Streifen von 29, wenn der erwartete Streifen pro Formel 19 ist). Wenn der Generator wirklich zufällig ist, sollte er näher an der erwarteten Zahl liegen. Ich habe meinen Code unten zur Verfügung gestellt:Roulette-Rad - Zählen gerade/ungerade Streifen ohne Array

for(int i = 1; i <= 1000000; i++) { 
     int randomNumber = gen.nextInt(37); 
     wheel.setNumber(randomNumber); 
     String numberColor = wheel.getColor(); 

//COUNTS THE LONGEST STRING OF EVENS 
     if ((lastNum % 2 == 0) && (randomNumber % 2 == 0) && randomNumber != 0 && lastNum != 0) { 
      tempEven++; 
      tempOdd = 1; 
     } else { 
      if (tempEven > longestEven) { 
       longestEven = tempEven; 
       tempEven = 1; 
      } 
     } 

//COUNTS THE LONGEST STRING OF ODDS 
     if ((lastNum % 2 == 1) && (randomNumber % 2 == 1) && randomNumber != 0 && lastNum != 0) { 
      tempOdd++; 
      tempEven = 1; 
     } else { 
      if (tempOdd > longestOdd) { 
       longestOdd = tempOdd; 
       tempOdd = 1; 
      } 
     } 
} 

Wenn jemand meinen Code überprüfen und sicherstellen könnte, dass meine Logik korrekt ist, würde ich es wirklich schätzen.

+0

wo wird lastNum deklariert? und wie wird es aktualisiert? Oder brauchen Sie Hilfe? –

+0

lastNum wird oben (hier nicht sichtbar) beginnend bei 1 initialisiert. Ich bin mir nicht ganz sicher, wo ich mit meiner Logik falsch liege. – user6014700

+0

Sehen Sie meine Antwort, weil es scheint, als würden Sie den Streifen nicht in allen Fällen zurücksetzen. Zum Beispiel, wenn es "gerade, gerade, gerade, ungerade, gerade" geht, wird tempEven nach dieser Iteration 4 sein, wenn es von 3 auf 1 hätte zurückgesetzt werden sollen. –

Antwort

0

Es gibt ein Problem, wie Sie Ihre if Anweisungen verwenden:

if ((lastNum % 2 == 0) && (randomNumber % 2 == 0) && randomNumber != 0 && lastNum != 0) { 
     tempEven++; 
     tempOdd = 1; 
    } else { 
     if (tempEven > longestEven) { 
      longestEven = tempEven; 
      tempEven = 1; 
     } 
    } 

Hier können Sie gehen davon aus, dass, wenn die Bedingung false ist, bedeutet es, dass randomNum ungerade ist, was nicht der Fall ist (zB lastNum ist ungerade und randomNum wird sogar false zurückgeben). Das Gleiche gilt für Ihre zweite if Aussage.

So etwas wie dies funktionieren würde:

if(randomNum is even) { 
    if(lastNum is even) { 
     //... 
    } else { 
     //... 
    } 
} else { 
    if(lastNum is even) { 
     //... 
    } else { 
     //... 
    } 
} 
0

Von dem, was ich sammeln kann, so scheint es, dass Sie nur nur tempEven bis 1 in 2 Fällen zurückgesetzt wird. Diese Fälle sind

  • tempEven größer als longestEven (Stromsträhne Evens ist länger als der längste Streifen von Evens)
  • zwei aufeinanderfolgende ungerade Zahlen

jedoch gefunden werden, ein Fall, der ist, Ausgelassen ist, wenn nach einer geraden Zahl eine ungerade Zahl gefunden wird, die den aktuellen Gleichungsstrich unterbricht. Ihr Code versucht, dies im else-Teil der beiden if-Anweisungen zu behandeln. Wenn tempEven jedoch nicht größer ist als longestEven, wird tempEven nie auf 1 zurückgesetzt. Wenn der Streak unterbrochen ist, sollte tempEven zurückgesetzt werden, egal was passiert. In diesem Fall, sagen wir mal, finden wir eine ungerade Zahl nach einer Folge von 8 geraden Zahlen in einer Reihe. Wenn longestEven 10 ist, wird tempEven nicht zurückgesetzt. Und wenn die nächste Zahl eine gerade Zahl ist, wird tempEven immer noch nicht zurückgesetzt, weil longestEven immer noch größer ist. Dann, sagen wir mal, wird eine weitere gerade Zahl gefunden, der ursprüngliche Streifen, der hätte gebrochen werden sollen, wird hinzugefügt. Wie Sie sehen, könnte dies die ungenaue Streak-Nummer erklären. Dieselbe Art von Logik gilt auch für die Strähne von ungeraden Zahlen. Mein Vorschlag ist, if-else-Anweisungen zu verwenden, um alle 3 Fälle getrennt zu behandeln. Mit else if-Anweisungen wird nur eine der Anweisungen in der Sequenz (die jeweils einen separaten Fall darstellen) ausgeführt, wodurch der Code wirklich bereinigt wird.

  • zwei aufeinander folgende geraden Zahlen gefunden (in der tempEven)
  • eine ungerade und eine gerade Zahl gefunden nebeneinander (überprüfen, um zu sehen, ob die Streifen als die längsten bisher gefunden größer sind und entsprechend aktualisieren, dann die temporären Streifen auf 1 zurückgesetzt) ​​
  • zwei aufeinander folgende ungeraden Zahlen gefunden (in der tempOdd)

    for(int i = 1; i <= 1000000; i++) { 
        int randomNumber = gen.nextInt(37); 
        wheel.setNumber(randomNumber); 
        String numberColor = wheel.getColor(); 
    
    //COUNTS THE LONGEST STRING OF EVENS 
        if ((lastNum % 2 == 0) && (randomNumber % 2 == 0) && randomNumber != 0 && lastNum != 0) { 
         tempEven++; 
        } 
    //ONCE A STREAK IS BROKEN BY FINDING A ODD NUM AFTER A EVEN NUM 
    //OR A EVEN NUM AFTER A ODD NUM 
    //THIS ELSE IF STATEMENT COULD BE SEPARATED INTO TWO ELSE IF STATEMENTS 
    //BUT IT IS MEANT TO ILLUSTRATE A CASE 
        else if(((lastNum % 2 != 0 && randomNumber % 2 == 0) || (lastNum % 2 == 0 && randomNumber % 2 != 0)) && (randomNumber != 0 && lastNum != 0)){ 
         if(tempEven > longestEven){ 
           longestEven = tempEven; 
         } 
         if(tempOdd > longestOdd){ 
           longestOdd = tempOdd; 
         } 
         //streak should be reset no matter what once this case is found 
         tempEven = 1; 
         tempOdd = 1; 
    
        } 
    //COUNTS THE LONGEST STRING OF ODDS 
        else if ((lastNum % 2 == 1) && (randomNumber % 2 == 1) && randomNumber != 0 && lastNum != 0) { 
         tempOdd++; 
         tempEven = 1; 
        } 
    } 
    
0

ich denke, Ihr Haupt prob lem ist viel zu viel Code. Versuchen Sie folgendes:

int longestEvenRun = 0, longestOddRun = 0, evenRun = 0, oddRun = 0, last = -1; 
for (int i = 0; i < 1000000; i++) { 
    int randomNumber = gen.nextInt(37); 
    int odd = randomNumber & 1; // 1 if odd, 0 if even 
    if (odd == last) { 
     longestOddRun = Math.max(++oddRun, longestOddRun); 
     evenRun = 0; 
    } else { 
     longestEvenRun = Math.max(++evenRun, longestEvenRun); 
     oddRun = 0; 
    } 
    last = odd; 
} 

Das einzige, was hier vielleicht um Erklärung randomNumber & 1, das eine bitweise tut und der Zufallszahl mit 1 zu maskieren alle, aber die niedrigste Bit ab, die 1 für Off Zahlen und 0 für gerade Zahlen. Dies vereinfacht die Logik erheblich. Beachten Sie, dass die last-Variable mit einem Wert initialisiert wird, der weder off noch even ist, sodass die erste Iteration ordnungsgemäß funktioniert.