2013-12-07 5 views
1

Я пытаюсь создать ряд не дублированных случайных чисел между 1 - 10, я планировал сделать это, сохранив каждое случайное число, которое я сделал в массиве, и затем каждый раз проверяю этот массив на убедитесь, что я еще не использовал номер.Не дублирующиеся случайные числа в C#

Моя проблема заключается в том, что вместо создания разных случайных чисел, таких как 1, 2, 3, я просто продолжаю получать одно и то же случайное число снова и снова.

 randomNumber(); 
     Label1.Text = randomRow + ""; 
     randomNumber(); 
     Label2.Text = randomRow + ""; 
     randomNumber(); 
     Label3.Text = randomRow + ""; 

     public int randomNumber() 
     { 
     List<int> numbers = new List<int>(); 
     int num = 0; 
     Random randNum = new Random(); 
     num = randNum.Next(1, 11); 

     if (numbers.Contains(num)) 
     { 
      num = randNum.Next(1, 11); 
     } 
     else 
     { 
      randomRow = num; 
      numbers.Add(num); 
     } 

     return randomRow; 
    } 
+1

Вы должны засеять случайное число: Randomd RND = новый Random (DateTime.Now.Millisecond), например –

+1

Не создавать новый случайный экземпляр каждый раз. Создайте его один раз и сохраните в поле. –

+1

Кроме того, список 'numbers' будет существовать только внутри' randomNumber() ', и каждый вызов будет иметь свой собственный список. Вы уверены, что это то, что вы хотите? Другое дело: вы генерируете только новое случайное число, если сгенерированное уже существует. Вы не проверяете вновь созданный. – ChrisK

ответ

3

Проблема: каждый раз, когда вы создаете RandomNumber объект слишком близко время.

Когда вы создаете объект Random, он засевается значением из системных часов. Если вы создадите случайные экземпляры слишком близко по времени, все они будут засеяны с одинаковой случайной последовательностью.

От Here

При создании случайного объекта, он высевает со значением от системных часов. Если вы создадите случайные экземпляры слишком близко по времени, они будут высеваться с одинаковой случайной последовательностью.

Решение:

движение Random randNum = new Random(); вне функции randomNumber().

Попробуйте:

Random randNum = new Random(); 
public int randomNumber() 
    { 
    List<int> numbers = new List<int>(); 
    int num = 0; 

    num = randNum.Next(1, 11); 

    if (numbers.Contains(num)) 
    { 
     num = randNum.Next(1, 11); 
    } 
    else 
    { 
     randomRow = num; 
     numbers.Add(num); 
    } 

    return randomRow; 
} 
+1

Вы также должны сообщить, почему это будет работать, а не другое? –

+0

@RohitVats: Спасибо за ценный комментарий, добавили ссылку. –

+0

Невозможно вывести создание случайного числа, даже внутри функции он даст отдельные результаты – tariq

0

Мои лучшие догадывался, что вы используете это в цикле. В этом случае, потому что вы заявляете

Random randNum = new Random(); 

evry time это будет генерировать такое же число. Просто объявляйте его перед циклом, и все должно быть хорошо.

Также вы должны рассмотреть другой подход, потому что это не очень хорошая практика. Как:

int[] array = {1,2,3,4,5,6,7,8,9,10}; 
    Random randNum = new Random(); 
    int rand=0; 
    int temp; 
    for(int i = 0; i<10;i++) 
    { 
     rand = randNum.next(1,10-i); 
     temp=array[rand]; 
     array[rand]=array[9-i]; 
     array[9-i]=temp; 
    } 
+0

Зачем использовать другой подход? Для всего десяти чисел этот подход является разумным. –

+0

Потому что это не очень хорошая практика, если вам понадобится следующий номер 100000 в случайном порядке, для этого потребуется много времени. – PeterRing

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