2015-03-27 3 views
0

Привет, я искал по всему Интернету этот ответ и, пожалуйста, позвольте мне объяснить, прежде чем я попаду в настоящую проблему. это может показаться простым, но единственным выбором, который действительно помог мне, был Thread.Sleep и Thread.SpinWait, но он в основном останавливает мою программу во время сна, а отжим спина также не позволяет мне указывать определенное время, например, количество секунд на наверху этого. Я также пытался использовать встроенный таймер, но я понятия не имел, как получить/создать callbacktimer или что это такое, что необходимо для создания таймера. Я также использовал простой таймер в цикле While (ниже) в других моих проектах, которые работали на отсчет или подсчитать, поэтому я попытался его здесь, но он не работал здесьСлучайные числа для циклов


.

public bool timerDone(GameTime gt) 
     { 
      float timer = 0; 
      while (timer < 0.5f) 
      { 
       timer += (float)gt.ElapsedGameTime.TotalSeconds; 
      } 
      return true; 
     } 

Теперь вот моя фактическая проблема, которую я имел более 3 недель, и только стать более запутанной мой поиск в Интернете с помощью Google, в форумах, на помощь сайты и т.д. Я генерируя несколько числа относительно близки друг к другу, и я получаю одно и то же число несколько раз подряд, как указано выше. Я использовал таймер ожидания и ожидания, который работал лучше всего, но их недостатки заставляют меня не хотеть использовать их, или я не могу правильно их использовать , Этот код ниже - это всего лишь один экземпляр меня, используя случайное число в функции, которая вызывается в цикле for и получает одно и то же число снова и снова.

public Chromosome roulette() 
     { 
      int totalChromosomeFitness = 0; 
      for (int i = 0; i < activePopulation.getChromosomeList().Count; i++) 
      { 
       totalChromosomeFitness += activePopulation.getChromosomeList()[i].getChromosomeFitnessValue(); 
      } 

      Random randFit = new Random(); 
      int selectedFitness = randFit.Next(0, totalChromosomeFitness + 1); 
      int currentFitness = 0; 
      Chromosome selectedChromosome = activePopulation.getChromosomeList()[0]; 

      for (int i = 0; i < activePopulation.getChromosomeList().Count; i++) 
      { 
       if (i < activePopulation.getChromosomeList().Count - 1) 
       { 
        if (currentFitness <= selectedFitness && (currentFitness + activePopulation.getChromosomeList()[i + 1].getChromosomeFitnessValue()) >= selectedFitness) 
        { 
         Debug.WriteLine("Gen: " + (generationNumber - 1) + " i: " + i); 
         selectedChromosome = activePopulation.getChromosomeList()[i]; 
         return selectedChromosome; 
        } 
       } 
       else 
       { 
        Debug.WriteLine("Gen: " + (generationNumber - 1) + " i: " + i); 
        selectedChromosome = activePopulation.getChromosomeList()[i]; 
        return selectedChromosome; 
       } 

       currentFitness += activePopulation.getChromosomeList()[i].getChromosomeFitnessValue(); 
      } 

      return selectedChromosome; 

     } 

Здесь я звоню в рулетку.

for (int i = 0; i < (activePopulation.getMaxChromosomes() - 2); i += 1) 
      { 
       //Chromosome mom = activePopulation.getChromosomeList()[i]; 
       //Chromosome dad = activePopulation.getChromosomeList()[i + 1]; 
       //newChromosome.Add(mom); 
       //newChromosome.Add(dad); 

       Thread.Sleep(500); 
       Chromosome mom = roulette(); 

       Thread.Sleep(500); 
       Chromosome dad = roulette(); 

       Thread.Sleep(500); 
       Chromosome baby1 = Crossover(dad, mom, gt); 
       newChromosome.Add(baby1); 

       //Thread.Sleep(500); 
       //Chromosome baby2 = Crossover(mom, dad, gt); 
       //newChromosome.Add(baby2); 
      } 

Как вы можете видеть это делает его таким образом, он будет генерировать новые номера он, к сожалению, делает это так, пока он спит, другие области моей программы, как функция рисования не изменится, а (что мне нужно его), но таймер, который я использовал, подсчитывал значение до нужного значения, но фактически не останавливался или не задерживался при создании случайного значения (что, по моему мнению, цикл while помог бы с этим немного). Я знаю, насколько случайным является зависящий от времени, и это побочный эффект указанной зависимости. Также я слышал, что термин «семена» очень много на сайтах, которые я посетил, для поиска этого решения, и я вроде понимаю, посеяв мой случайный или что-то, что я могу заставить его изменить значение случайного.

Итак, как я могу заставить это работать так, как ему нужно, не останавливая остальную часть моей программы (например, как некоторые языки или двигатели имеют таймер ожидания, который действует как задержка для этой части программы, только как waitforseconds единства)?

Прошу прощения, если моя формулировка странная. У меня просто много проблем с этим, и это похоже на 2:30 здесь, и мне сложно спать с этой проблемой.

+0

Переместить 'Random randFit = new Random();' вне вашего метода, создавая 'randFit' поле' static readonly' где-нибудь, так что он будет только когда-либо инициализирован один раз. –

ответ

1

У вас есть только одинRandom в программе yopur.

Так двигаться

Random randFit = new Random(); 

в какой-то статический класс.

Причина: Генератор случайных чисел запускается с фиксированным nimber (семя) и производит всегда ту же последовательность, начинающуюся с этого семени. Обычно семя происходит от текущего времени, но изменяется только через несколько миллисекунд. Если вы создадите несколько классов Random за короткий промежуток времени, все эти генераторы чисел генерируют в той же последовательности.

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

  • Нет связанных вопросов^_^