2015-01-11 2 views
0

Я разрабатываю программу, которая одновременно генерирует до 2 действующих IMEI-кодов для тестирования мобильных телефонов. Хотя есть способ для каждого из двух кодов, программа всегда возвращает одно и то же значение для обоих (например, IMEI 1 = IMEI 2). Вот пример обоих методов (только соответствующие части).C# Различные случайные функции, генерирующие одно и то же значение

IMEI 1:

public String IMEICode() 
    { 
     int[] code = new int[14]; 
     Random generate = new Random(); 
     int format = FormatCombo.SelectedIndex; 
     StringBuilder IMEI = new StringBuilder(); 
     ... //irrelevant 
     for (int i = 0; i < code.Length; i++) 
     { 
      code[i] = generate.Next(10); 
     } 
     ... //irrelevant 
     return IMEI.ToString(); 
    } 

IMEI 2:

public String IMEICode2() 
    { 
     int[] code2 = new int[14]; 
     Random generate2 = new Random(); 
     int format = FormatCombo.SelectedIndex; 
     StringBuilder IMEI2 = new StringBuilder(); 
     ... //irrelevant 
     for (int i = 0; i < code2.Length; i++) 
     { 
      code2[i] = generate2.Next(10); 
     } 
     ... //irrelevant 
     return IMEI2.ToString(); 
    } 

Программа имеет 2 текстовых поля для отображения сгенерированных кодов (field1 и Field2), каждый из которых, назначенных к способу (IMEICode() и IMEICode2()).

PS .: Я убедился, что в первом текстовом поле отображается метод IMEICode(), а последний отображает метод IMEICode2().

+2

Используйте тот же самый объект «Случайный» для обоих случаев. –

ответ

4

Начальное значение по умолчанию получено из системных часов и имеет конечное разрешение. В результате разные объекты Random, созданные в тесной последовательности вызовом конструктора по умолчанию, будут иметь одинаковые начальные значения по умолчанию, и поэтому будет производить идентичные наборы случайных чисел. Эта проблема может быть устранена , используя один случайный объект для генерации всех случайных чисел. Вы также можете обойти его, изменив начальное значение, возвращаемое системными часами, а затем явно предоставив это новое начальное значение конструктору Random(Int32). (от MSDN)

Использовать такой же Random объект для обоих случаев.

public static Random generate = new Random(); 

    public String IMEICode() 
     { 
      int[] code = new int[14]; 
      int format = FormatCombo.SelectedIndex; 
      StringBuilder IMEI = new StringBuilder(); 
      ... //irrelevant 
      for (int i = 0; i < code.Length; i++) 
      { 
       code[i] = generate.Next(10); 
      } 
      ... //irrelevant 
      return IMEI.ToString(); 
     } 

    public String IMEICode2() 
     { 
      int[] code2 = new int[14]; 
      int format = FormatCombo.SelectedIndex; 
      StringBuilder IMEI2 = new StringBuilder(); 
      ... //irrelevant 
      for (int i = 0; i < code2.Length; i++) 
      { 
       code2[i] = generate2.Next(10); 
      } 
      ... //irrelevant 
      return IMEI2.ToString(); 
     } 
+0

Спасибо! Ваш ответ решил мою проблему. – AlanC92

+1

Класс 'Random' не является потокобезопасным, поэтому вы наступаете на тонкий лед здесь, полагаясь на характер резьбы тестового бегуна. Лучше использовать 'ThreadLocal ' вместо этого. – tia

+0

Дополнительная информация о безопасности потоков и случайных по http://stackoverflow.com/questions/3049467/is-c-sharp-random-number-generator-thread-safe –

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