Случайные числа в циклах

Привет, я искал во всем Интернете этот ответ, и, пожалуйста, позвольте мне объяснить, прежде чем я вхожу в реальную проблему это может показаться простым, но единственными вариантами, которые действительно помогли мне, были 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);
            }

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

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

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

1 ответ

У тебя должен быть только один Randomв программе йопур.

Так двигайся

Random randFit = new Random();

в некоторый статический класс.

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

Другие вопросы по тегам