2015-10-03 4 views
0
int[] RandArray = new int[6]; 

     Random randNumber = new Random(); 
     for (int Counter = 0; Counter < RandArray.Length; Counter++) 
     { 
      RandArray[Counter] = randNumber.Next(1,50); 

     } 

     Console.WriteLine(RandArray[0]); 
     Console.WriteLine(RandArray[1]); 
     Console.WriteLine(RandArray[2]); 
     Console.WriteLine(RandArray[3]); 
     Console.WriteLine(RandArray[4]); 
     Console.WriteLine(RandArray[5]); 
     Console.ReadLine(); 

Эта программа генерирует 6 случайных чисел от 1 до 49. В настоящее время он производит те же цифры в два раза. Как заставить его не дублировать какой-либо номер? И может ли этот код быть улучшен?C# Удалить дубликаты из массива

+0

http://codereview.stackexchange.com/questions/61338/generate-random-numbers-without-repetitions –

+0

Спасибо вы быстро реагируете. Я забыл спросить, как я могу поместить окончательный список чисел в порядке возрастания? –

+0

@HaseebAhmed, я обновил свой ответ, чтобы показать, как заказать список. –

ответ

2

Вы можете использовать HashSet, чтобы сохранить числа, которые вы создали пока. HashSet добавит только вновь сгенерированный номер, если он уже не содержит номер. Как это:

Random rand_number = new Random(); 

HashSet<int> numbers = new HashSet<int>(); 

while (numbers.Count < 6) 
{ 
    int new_number = rand_number.Next(1, 50); 

    numbers.Add(new_number); 
} 

Вы можете использовать List вместо HashSet если вы хотите, но HashSet будет выполнять sigificantly лучше, если количество целых чисел, чтобы генерировать большой.

Вы можете конвертировать результат в массив после того, как вы закончите (если вы хотите), как это:

int[] integer_array = numbers.ToArray(); 

Вместо этого, вы можете это сделать, если вы хотите, чтобы номера заказываются по возрастанию:

int[] integer_array = numbers.OrderBy(x => x).ToArray(); 
+1

вам не нужен 'Contains()', поскольку int wont будет добавлен, если он уже находится в наборе. – Ric

+0

хороший ответ, хотя +1 – Ric

+0

Вы правы. Благодарю. Я удалил его. –

1

Это отвечает на ваш вопрос названия.
Использование Distinct оператора LINQ, он удалит повторяющиеся элементы https://msdn.microsoft.com/en-us/library/vstudio/bb348436(v=vs.100).aspx

Это отвечает на ваше тело вопрос
Чтобы не генерировать тот же номер несколько раз, хранить номера в HashSet и проверять каждую итерацию, если номер был сгенерирован предварительно и повторно, если необходимо.

0

Вы можете проверить дубликат для каждого номера, который вы создаете:

int[] RandArray = new int[6]; 

Random randNumber = new Random(); 
for (int Counter = 0; Counter < RandArray.Length; Counter++) { 
    // Loop until you find an unused number 
    bool found; 
    do { 
    // Get a random number 
    int num = randNumber.Next(1,50); 
    // Look through the numbers picked so far 
    found = false; 
    for (int i = 0; i < Counter; i++) { 
     found |= num == RandArray[i]; 
    } 
    // If the number was found go back and pick a new one 
    } while(found); 
    // Put the number in the array 
    RandArray[Counter] = num; 
} 

foreach (int n in RandArray) { 
    Console.WriteLine(n); 
} 
Console.ReadLine(); 
1

Вы можете создать диапазон чисел от 1 до 50, заказать их в случайном порядке, а затем 6 из этого диапазона в список:

var rnd = new Random(); 
var randomNumbers = Enumerable.Range(1,50).OrderBy(x => rnd.Next()).Take(6).ToList(); 

.NET Fiddle - https://dotnetfiddle.net/i06zCY

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