2017-08-19 10 views
-2

私はパスファインダーを書こうとしていますが、いくつか問題があります。rand()とsrand()に問題があります

私は現在、4つのケースを持つswitch()を持っており、それらのうちの1つをランダムに選択したいと考えています。

do 
    { 
     if (checkLeft()==false && checkRight()==false && checkUp()==false && checkDown()==false) 
     { 
      cont = false; 
     } 

     int x = rand() % 4; 
     srand(static_cast<unsigned int>(time(NULL))); 
     if (cont == true) 
     { 
      switch(x) 
      { 
       case 0: 
        checkRight(); 
        break; 

       case 1: 
        checkDown(); 
        break; 

       case 2: 
        checkUp(); 
        break; 

       case 3: 
        checkLeft(); 
        break; 
      } 

     } 

    } while (currentx != max && currenty != max && cont == true); 

「do」ループなので、実際にはランダムではないようですね。私は一貫して同様の結果を得ます。 switch()から完全にランダムな出力が得られるようにするにはどうすればいいですか?

THanks!

+0

メインの冒頭にsrandを1回だけ使用します。 – theVoid

答えて

0

すでに種を使用していたはずのrand()の後にsrand()を呼び出しています。 rand()の前にsrand()を呼び出すと、一度呼び出すだけで済みます。だから、do-whileの前にそれを呼んでください。 はまた、あなたがしばらく

0

を見てみたいことがあり、より良い秒よりも任意の解像度を持つことが必要とされていません。あなたのプログラムがかなりの期間実行されない限り、それを複数回呼び出すと、同じ値に何度も再シードされることがあります。それはあなたの "一貫して同様の"結果を説明します。コードを「そのまま」複数回、数秒または数分で実行すると、結果が異なることがあります。しかし、連続して数回実行すると、同じ値が繰り返し返され、値がゆっくりと変化する可能性があります。

一般的に言えば、の最初のコールの前に、プログラム内で正確にsrand()と呼んでください。

C++ 11以降を使用している場合は、より高品質のジェネレータが使用できます。ドキュメントをお読みください。

関連する問題