1

嗨,我已经在整个互联网上搜索了这个答案,请在我进入实际问题之前让我解释一下。它可能看起来很简单,但真正帮助我的唯一选择是 Thread.Sleep 和 Thread.SpinWait 但它基本上在它的睡眠和旋转等待期间停止我的程序也不允许我把它放在一个特定的时间,比如秒数最重要的是。我也尝试过使用内置计时器,但我不知道如何获取/创建回调计时器或创建计时器所需的内容。我还在我的其他项目中的while循环中使用了一个简单的计时器(如下)


.

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

现在这是我的实际问题,我已经有超过 3 周的时间了,只是因为我在互联网上使用谷歌、论坛、帮助网站等进行搜索而变得更加困惑。我生成了几个彼此相对接近的数字,并且我连续多次获得相同的数字,因此如上所述,我使用了效果最好的睡眠和等待计时器,但它们的缺陷使我不想使用它们,或者我无法正确使用它们。下面的代码只是我在 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 循环会有所帮助)。我知道随机性是如何依赖时间的,这是所述依赖的副作用。此外,我在搜索此解决方案时访问的站点中也经常听到“种子”一词,我通过播种我的随机数或我可以得到它来改变随机数的值来理解它。

那么如何在不停止程序的其余部分的情况下让它以它需要的方式工作(比如某些语言或引擎如何有一个等待计时器,它只像统一的 waitforseconds 一样充当程序这一部分的延迟)?

如果我的措辞很奇怪,我很抱歉,我只是在这方面遇到了很多麻烦,现在是凌晨 2 点 30 分,我很难在这个问题上入睡。

4

1 回答 1

2

你应该在 yopur 程序中只有一个。 Random

所以动起来

Random randFit = new Random();

到一些静态类。

原因:随机数生成器以固定的 nimber(种子)启动,并始终从该种子开始生成相同的序列。通常种子是从当前时间派生的,但仅在几毫秒后发生变化。如果您Random在短时间内创建多个类,所有这些数字生成器都会生成相同的序列

于 2015-03-27T06:45:53.413 回答