2017-01-17 2 views
-4

Кто-нибудь есть идеи, почему эта часть C# код возврата x = 0 и y = 0 (ocassionally):C# Random.Next (мин макс.) Возвращаемое значение меньше, чем мин

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

нужно всего лишь головы, вы должны использовать один и тот же экземпляр 'Random' в этом случае. Как есть, очень * вероятно, что 'x' и' y' будут одинаковыми, так как два случайных экземпляра будут иметь одно и то же семя. Что касается вашей ошибки, это не кажется возможным на основе кода, который вы показали (или есть ошибка в «Случайном», что маловероятно). – vcsjones

+0

@vcsjones Я использовал тот же экземпляр, но 0 0 продолжал появляться, поэтому я перехожу к этому. Кстати, мой главный вопрос: почему функция Next() возвращает значение меньше минимального значения, которое я предоставил? Спасибо – EagerToLearn

+3

Я бы предположил, что это обстоятельство, когда эти две строки фактически не работают, хотя в настоящее время вы считаете, что они это сделали. Невозможно сказать только из этого кода. –

ответ

4

Вы никогда не получать внутри цикла while, хотя мы не можем сказать, с какими lstPosition установлен с кодом, который вы указали. Предложение where должно возвращать пустой набор.

В этой ситуации нет нулевого пути Random.Next(int, int).

Предположительно, вы хотите инициализировать x и y ненулевое значение.

2

Вы, вероятно, хотите что-то вроде этого:

// 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); 
    } 
}