2015-05-03 5 views
0

Привет всем Я пытаюсь сгенерировать 6 разных номеров в одной строке в C#, но проблема, с которой я сталкиваюсь, - это некоторые из чисел, повторяющихся в одной строке. Вот мой код:Генерация случайных чисел без повторения. C#

List<int> listNumbers = new List<int>(); 
int numbers = rand.Next(1,49); 
for (int i= 0 ; i < 6 ;i++) 
    { 
     listNumbers.Add(numbers); 
     numbers = rand.Next(1,49); 
    } 

где мой выход

17 23 23 31 33 48 
+2

единственность не свойство случайности. «Случайный» означает, что число не является детерминированным. То, о чем вы спрашиваете, состоит в том, что число определяется предыдущим состоянием. – David

+0

Поместите цифры от 1 до 49 в списке. Затем выберите один случайный случай и удалите его после того, как вы это сделаете, повторите, пока вы не достигнете достаточно. Или перепутайте их и выберите первые шесть. Как только вы говорите случайные и уникальные, случайный находится в корзине ... –

ответ

4

Проверьте каждый номер, который вы создаете по сравнению с предыдущими номерами:

List<int> listNumbers = new List<int>(); 
int number; 
for (int i = 0; i < 6; i++) 
{ 
    do { 
    number = rand.Next(1, 49); 
    } while (listNumbers.Contains(number)); 
    listNumbers.Add(number); 
} 

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

List<int> possible = Enumerable.Range(1, 48).ToList(); 
List<int> listNumbers = new List<int>(); 
for (int i = 0; i < 6; i++) 
{ 
    int index = rand.Next(0, possible.Count); 
    listNumbers.Add(possible[index]); 
    possible.RemoveAt(index); 
} 
+0

Почему downvote? Если вы не объясните, что это такое, что вы считаете неправильным, оно не может улучшить ответ. – Guffa

+0

Я не ответил на ваш ответ, но ваше первое решение кажется немного беспорядочным. Хотя он будет работать, я думаю, что лучше изменить цикл for на цикл while, как в [мой ответ.] (Http://stackoverflow.com/a/30014963/3094533) –

+0

они оба работают благодаря –

1

Сделать петлю в то время как и добавить целые числа в HashSet. Остановите цикл, если у вас шесть целых чисел.

+0

Это интересная идея, но нет хорошего способа получить значения из хеш-набора. Порядок элементов в хэш-наборе не определен, поэтому вы можете получить их в порядке, который зависит от значения, а не от того, в каком порядке они были добавлены. – Guffa

+0

Добавить каждое число в список возврата, поскольку они добавляются в хэш, если сгенерированный порядок важен. – idstam

+0

Порядок определенно важен. Если элементы перегруппированы в зависимости от значения, список больше не случайный. Простое добавление номеров в список означает, что список может содержать дубликаты. Вам нужно будет проверить, существует ли номер в хэш-наборе, чтобы определить, следует ли его добавить в список или нет. – Guffa

0

Что вы делаете, это генерировать случайное число каждый раз в цикле. Конечно, есть вероятность, что следующее случайное число может быть таким же, как и предыдущее. Просто добавьте одну проверку, что текущее случайное число отсутствует в последовательности. Вы можете использовать цикл while, как: while (currentRandom not in listNumbers): generateNewRandomNumber

0

Я включил цикл for с циклом do ... while и установил условие остановки, когда количество списков меньше 6. Это может быть не лучшее решение, но оно ближе всего к вашему исходному коду.

List<int> listNumbers = new List<int>(); 
do 
    { 
     int numbers = rand.Next(1,49); 
     if(!listNumbers.Contains(number)) { 
      listNumbers.Add(numbers); 
     } 
    } while (listNumbers.Count < 6) 
+0

Это не самый близкий к исходному коду. Проверьте мой ответ на решение, которое ближе к исходному коду. – Guffa

+0

Ну, ты меня там :-) –

0

Наилучший подход (процессорное время мудро) для таких задач является создание массива всех возможных чисел и с 6 пунктов из него при удалении элемента вы просто взяли из массива. Пример:

const int min = 1, max = 49; 
List<int> listNumbers = new List<int>(); 
int[] numbers = new int[max - min + 1]; 
int i, len = max - min + 1, number; 

for (i = min; i < max; i++) numbers[i - min] = i; 
for (i = 0; i < 6; i++) { 
    number = rand.Next(0, len - 1); 
    listNumbers.Add(numbers[number]); 
    if (number != (len - 1)) numbers[number] = numbers[len - 1]; 
    len--; 
} 
0

Вместо того, чтобы использовать список, вы должны использовать HashSet. HashSet <> запрещает несколько одинаковых значений. И метод Add возвращает bool, который указывает, был ли элемент добавлен в список. Ниже приведен пример кода ниже.

public static IEnumerable<int> GetRandomNumbers(int count) 
{ 
HashSet<int> randomNumbers = new HashSet<int>(); 

for (int i = 0; i < count; i++) 
    while (!randomNumbers.Add(random.Next())); 

return randomNumbers; 
} 
2
listNumbers.AddRange(Enumerable.Range(1, 48) 
           .OrderBy(i => rand.Next()) 
           .Take(6)) 
+0

Перемешивание, упорядочивая случайное число, не очень хороший метод, вместо этого нужно использовать Shuffle Fisher-Yates. Случается, что в этом случае LINQ кэширует значения, которые он получает от предиката, но для других реализаций сортировки он не будет работать должным образом. – Guffa

+0

См .: http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html – Guffa

0

Вставить ниже в класс как новый метод

public int randomNumber() 
    { 
     var random = new Random(); 
     int randomNumber = random.Next(10000, 99999); 
     return randomNumber; 
    } 

ниже и используйте где-нибудь в тестах, где требуется

вар RandNum = случайное число();

driver.FindElement (By.CssSelector ("[class = 'test']")). SendKeys (RandNum);

-1
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     int[] que = new int[6]; 
     int x, y, z; 
     Random ran = new Random();    
     for (x = 0; x < 6; x++) 
     { 
      que[x] = ran.Next(1,49); 
      for (y = x; y >= 0; y--) 
      { 
       if (x == y) 
       { 
        continue; 
       } 
       if (que[x] == que[y]) 
       { 
        que[x] = ran.Next(1,49); 
        y = x; 
       } 


      } 
     } 
     listBox1.Items.Clear(); 
     for (z = 0; z < 6**strong text**; z++) 
     { 
      listBox1.Items.Add(que[z].ToString()); 
     } 
    } 
} 
+0

Пожалуйста, отредактируйте свой ответ, чтобы дать объяснение, что вы сделали и почему – bc004346

0

Создать HashSet и генерировать уникальные случайные числа

public List<int> GetRandomNumber(int from,int to,int numberOfElement) 
{ 
    var random = new Random(); 
    HashSet<int> numbers = new HashSet<int>(); 
    while (numbers.Count < numberOfElement) 
    { 
     numbers.Add(random.Next(from, to)); 
    } 
    return numbers.ToList(); 
} 
Смежные вопросы