2017-01-17 8 views
-4

Hat jemand eine Ahnung, warum dieses Stück von C# -Code Rückkehr x = 0 und y = 0 (ocassionally):C# Random.Next (min max.) Rückgabewert kleiner als min

public void NewPos() 
{ 
    int x = 0; 
    int y = 0; 

    while (lstPosition.Where(z => z.Position.X == x && z.Position.Y == y).Count() != 0) { 
     x = new Random().Next(4, 20) * 10; 
     y = new Random().Next(4, 20) * 10; 
    } 

    NewPos.X = x; 
    NewPos.Y = y; 

    Console.WriteLine(x + " - " + y); 
} 
+3

Nur ein Heads-up, sollten Sie die gleiche Instanz von 'Random' in diesem Fall verwendet werden. Es ist sehr wahrscheinlich, dass "x" und "y" die gleiche Zahl sind, da die beiden Random-Instanzen den gleichen Startwert haben. Was Ihren Fehler betrifft, scheint das nicht möglich zu sein, basierend auf dem Code, den Sie angezeigt haben (oder es gibt einen Fehler in 'Random' - was unwahrscheinlich ist). – vcsjones

+0

@vcsjones Ich habe die gleiche Instanz verwendet, aber 0 0 wird immer angezeigt, also wechsle ich dazu. Übrigens ist meine Hauptfrage, warum die Next() - Funktion einen Wert zurückgibt, der kleiner als der von mir angegebene Wert ist. Danke – EagerToLearn

+3

Ich würde vermuten, dass es ein Umstand ist, bei dem die obigen zwei Zeilen nicht wirklich laufen, obwohl Sie derzeit glauben, dass sie es taten. Unmöglich, nur von diesem Code zu unterscheiden. –

Antwort

4

Sie sind nicht immer bekommen innerhalb der while-Schleife, obwohl wir nicht wissen, was lstPosition mit dem von Ihnen bereitgestellten Code festgelegt ist. Die WHERE-Klausel muss einen leeren Satz zurückgeben.

Es gibt keine Möglichkeit Random.Next(int, int) in dieser Situation Null zurückgibt.

Angenommen, Sie möchten x und y auf einen Wert ungleich null initialisieren.

2

Sie wahrscheinlich wollen etwas wie folgt aus:

// Do not recreate random 
// (otherwise you're going to have a badly skewed values); 
// static instance is the simplest but not thread safe solution 
private static Random s_Generator = new Random(); 

public void NewPos() { 
    // Just Any, not Where + Count 
    if (lstPosition.Any(z => z.Position.X == x && z.Position.Y == y)) { 
    // If we have such a point, resample it 
    NewPos.X = s_Generator.Next(4, 20) * 10; 
    NewPos.Y = s_Generator.Next(4, 20) * 10; 

    // Debug purpose only 
    Console.WriteLine(x + " - " + y); 
    } 
}