В то время как петли и проверка подход, вероятно, подходит здесь, вариант этот вопрос «Как получить 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
, заменяется только один раз (хотя его можно поменять местами). В любом случае, это оставалось для упражнения для читателя.
Вы понимаете, что это делает 'getRanNum2' немного менее случайным? Особенно на небольшом диапазоне, например '0..9'. –