For循环中的随机数

时间:2015-03-27 06:37:12

标签: c# random delay sleep spinwait

您好我已经在互联网上搜索了这个答案,请在解决实际问题之前让我解释一下。它可能看起来很简单,但真正帮助我的唯一选择是Thread.Sleep和Thread.SpinWait,但它基本上会在睡眠期间停止我的程序并且旋转等待也不允许我将其设置为特定的时间,例如最重要的是秒。我也尝试使用内置计时器,但我不知道如何获取/创建回调计或创建计时器所需的内容。我还在我的其他项目中使用了一个简单的计时器(下面),这个项目可用于倒计时或计数,所以我在这里尝试了但是它没有在这里工作


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);
            }

正如你所看到的那样,它会产生新的数字,但不幸的是,当它在我的程序的其他区域睡觉时,如绘图功能也不会改变(我需要它)但是,我使用的计时器确实计数得到了正确的值,但是当创建随机值时实际上没有停止或延迟(我认为while循环会有所帮助)。我知道随机是时间依赖的,这是所述依赖的副作用。此外,我在访问过的网站中听到了很多关于种子的搜索这个解决方案的问题。我通过播种我的随机或者我能得到它来改变随机值来理解它。

那么如何在不停止我的程序的其余部分的情况下让它以所需的方式工作(例如某些语言或引擎如何使用等待计时器作为程序的这一部分的延迟,就像团结一样#39 ; s waitforseconds)?

我很抱歉,如果我的措辞很奇怪,我只是在这方面遇到很多麻烦,就像凌晨2:30这样,我很难和这个问题一起睡觉。

1 个答案:

答案 0 :(得分:1)

你在yopur计划中只有一个 Random

所以移动

Random randFit = new Random();

到一些静态类。

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