2016-07-04 5 views
1

Ive получил класс Народонаселение с его конструктору:Почему я получаю случайные числа, когда я в режиме отладки?

private Individual[] m_population; 
    public Population() { 
     m_population = new Individual[POP_SIZE]; 
     for (int i = 0; i < POP_SIZE; i++) { 
      m_population[i] = new Individual(); 
      m_population[i].randGenes(); 
     } 
     //some other code here 
    } 

Внутри индивидуального класса у меня есть метод для randGenes():

Random rand2 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF); 

     public void randGenes() 
     { 
      for (int i = 0; i < SIZE; ++i) 
      { 
       for (int j = 0; j < SIZE; j++) 
       { 
        this.setGene(i, j, rand2.Next(1)); 
       } 
      } 
     } 

Я просто нужен набор из 25 radnom 1s и 0s для каждый из 10 человек. Но я всегда получаю одинаковый набор для каждого из 10 человек, когда я больше играю с ним, я получаю только 0. Только когда я вхожу в режим отладки, я получаю поистине случайные числа. Я вижу везде, что новый случайный случай должен быть создан вне метода и/или цикла, который я сделал, поэтому я не знаю, что делать дальше?

EDIT Мой вопрос не был дубликатом этого вопроса, потому что предоставленный мне ответ не помог мне. Что помогло мне, тем не менее, был ответ, который я дал ниже.

ответ

1

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

static Random rand2 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);

и он должен начать работать.

+0

Это решило, я попытался использовать статические случайные, но я не использовал дату-время как семя ... – Vrankela

+0

Вы, вероятно, должны полностью опустить семантику DateTime, так как это поведение по умолчанию в любом случае. Приятно слышать, что он сейчас работает для вас :) – Warrick

1

rand2 представляется переменной экземпляра, поэтому вы создаете генератор случайных чисел для каждого объекта. Поскольку Ticks - это число в миллисекундах, если ваш код выполняется достаточно быстро, семя будет одинаковым для каждого Individual, а все RNG возвращаются в одну и ту же последовательность.

Это не происходит, когда вы входите в отладчик, потому что вы вводите искусственную задержку.

Либо используйте один и тот же объект Random на каждые Individual, или разбросайте RNG по-разному.

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