2013-10-25 5 views
2

Я хотел бы создать два случайных числа, которые отличаются друг от друга. Например, если первое случайное число генерирует 5, я хочу следующее случайное число, генерируемое не равно 5. Это мой код до сих пор:Создание 2 случайных чисел, которые отличаются друг от друга C#

Random ran = new Random(); 
int getRanNum1 = ran.Next(10); 
int getRanNum2 = ran.Next(10); 

Как я говорю getRandNum2 не равно значение, сгенерированное в getRandNum1 ?

+3

Вы понимаете, что это делает 'getRanNum2' немного менее случайным? Особенно на небольшом диапазоне, например '0..9'. –

ответ

13

С петлей:

int getRanNum2 = ran.Next(10); 
while(getRanNum2 == getRanNum1) 
    getRanNum2 = ran.Next(10); 
5

В то время как петли и проверка подход, вероятно, подходит здесь, вариант этот вопрос «Как получить N различных случайных чисел в диапазоне (или набор)? "

Для этого одна из возможных альтернатив (и одна из которых мне нравится, поэтому я написал этот ответ) заключается в том, чтобы построить указанный диапазон (или набор), shuffle the items, а затем взять первые N элементов.

Внедрение Shiscle Fischer-Yates можно найти in this answer. Слегка очищено для ситуации:

void Shuffle (int arr[]) { 
    Random rnd = new Random(); 
    for (int i = arr.Length; i > 1; i--) { 
    int pos = rnd.Next(i); 
    var x = arr[i - 1]; 
    arr[i - 1] = arr[pos]; 
    arr[pos] = x; 
    } 
} 

// usage 
var numbers = Enumerable.Range(0,10).ToArray(); 
Shuffle(numbers); 
int getRanNum1 = numbers[0]; 
int getRanNum2 = numbers[1]; 

Поскольку мы знаем, что только N (2) выбирают элементы, то Shuffle выше метод на самом деле может быть модифицирован таким образом, что только N (2) свопы сделаны. Это связано с тем, что arr[i - 1], для каждого i, заменяется только один раз (хотя его можно поменять местами). В любом случае, это оставалось для упражнения для читателя.

Смежные вопросы