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週間以上抱えている実際の問題であり、Google、フォーラム、ヘルプサイトなどを使用してインターネットで検索することでさらに混乱するだけです.互いに比較的近いいくつかの数値を生成しています.私は同じ数を連続して取得するので、上記のようにスリープと待機タイマーを使用しましたが、これが最もうまく機能しましたが、それらの欠陥により、それらを使用したくないか、正しく使用できません。以下のこのコードは、for ループで呼び出される関数で乱数を使用し、同じ数を何度も取得する 1 つの例にすぎません。

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 ループが少し役立つと思いました)。ランダムが時間に依存する方法を認識しており、これは依存関係の副作用です。また、このソリューションを検索して訪れたサイトでシードという用語をよく耳にしました。ランダムまたはランダムの値を変更するためにそれを取得できるものをシードすることで、ある程度理解しています。

では、プログラムの残りの部分を停止することなく、これを必要な方法で機能させるにはどうすればよいですか (一部の言語またはエンジンには、プログラムのこの部分の遅延として機能する待機タイマーがあり、unity の waitforseconds のようにのみ機能します)。

私の言葉遣いがおかしくなったらごめんなさい。私はこれで多くの問題を抱えています。ここでは午前 2 時 30 分くらいで、この問題で眠れません。

4

1 に答える 1

2

yopur プログラムには1 つ しかないはずです。Random

だから動く

Random randFit = new Random();

いくつかの静的クラスに。

理由: 乱数ジェネレーターは固定の数値 (シード) で開始され、このシードから始まる常に同じシーケンスを生成します。通常、シードは現在の時刻から派生しますが、数ミリ秒後にのみ変更されます。Random短期間に複数のクラスを作成すると、これらすべてのナンバ ジェネレータが同じシーケンスを生成します

于 2015-03-27T06:45:53.413 に答える