2012-12-12 6 views
5

Mögliche Duplizieren:
Random number generator only generating one random numberCode wird nur korrekt ausgeführt, wenn er mit Debugger durchlaufen wird?

Ich war verblüfft etwas mit dieser vor wenigen Augenblicken. Ich habe den folgenden Code:

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 
    int makeBlockOfType = random.Next(0, 100); 

    blockType t = blockType.normal; 
    if (makeBlockOfType <= 80 && makeBlockOfType >= 60) 
    { 
     t = blockType.blue; 
    } 
    else if (makeBlockOfType > 80 && makeBlockOfType <= 95) 
    { 
     t = blockType.orange; 
    } 
    else if (makeBlockOfType > 95 && makeBlockOfType <= 100) 
    { 
     t = blockType.green; 
    } 

    return t; 
} 

Ziemlich einfach, es ist ein enum Wert zurückgeben basierend auf einer Zufallszahl (von Systemzeit basiert). Leider habe ich aus irgendeinem Grund alle Blöcke entweder in der einen oder in der anderen Farbe, obwohl das für jeden einzelnen Block läuft, der ins Spiel kommt. Wenn ich dies jedoch mit dem Debugger durchführe und dann die Ergebnisse nach einem Lauf sehe, sehe ich, dass die Blöcke jetzt basierend auf den bereitgestellten Chancen mehrfarbig sind. Ich bin ein wenig verwirrt darüber, warum das passiert.

Dafür verwende ich MonoGame, die den Mono-Compiler anstelle von Microsoft verwendet. Könnte das das Problem sein? Ich habe versucht, diesen Code in den Konstruktor inline zu setzen, von wo aus er aufgerufen wird, aber ich bekomme das gleiche Ergebnis (ich rate, der Compiler inline den Code sowieso).

Ich habe versucht, Visual Studio separat neu zu starten, anstatt den Build ausführen zu lassen; keine Änderungen.

Alle Vorschläge und Hilfe werden sehr geschätzt!

+1

Versuch Zufall Schöpfung aus dem Verfahren zu bewegen, soll dabei helfen. –

+0

'new Random()' seeds mit der Zeit, die für einige Millisekunden konstant bleibt. – CodesInChaos

+0

Der Grund, warum es im Debug funktioniert, ist, dass es Zeit zwischen den Aufrufen gibt und Random tatsächlich unterschiedliche Seeds bekommt. – Archy

Antwort

3

Wenn Sie nacheinander mehrere Instanzen von Random in einer sehr kurzen Zeitspanne erstellen, werden sie wahrscheinlich mit dem gleichen zeitabhängigen Startwert initialisiert.

Um dies zu umgehen, können Sie Ihre Random als Instanz Feld statt initialisieren sollte:

private readonly Random random = new Random(); 

public blockType generateRandomBlock() 
{ 
    int makeBlockOfType = random.Next(0, 100); 

    // ... 
} 
7

Sie sollten Zufalls instanziiert nur einmal (legen Sie es als ein privates Feld und Instanciate im Konstruktor) finden Sie in der ähnliche Frage: Random.Next returns always the same values

anzeigen Random documentation:

die Erzeugung von Zufallszahlen beginnt, sich von einem Startwert. Wenn die gleichen Samen wiederholt verwendet wird, wird die gleiche Reihe von Zahlen

erzeugt

In Ihrem Fall erstellen Sie eine zufällige Instanz mit dem gleichen Samen (zu nahe in der Zeit) und nehmen Sie den ersten Wert, der sein wird, das gleiche für einen gegebenen Samen.

4

Du erstellst deine Zufallszahlengenerator jedesmal, wenn Sie rufen Ihre Methode:

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 

Als Samen der Zufallszahlengenerator auf der Grundlage der Zeit diese den gleichen Wert für aufeinanderfolgende Anrufe zurück.

Bewegen Sie die Erstellung des Generators außerhalb der Routine:

Random random = new Random(); 
public blockType generateRandomBlock() 
{ 
Verwandte Themen