2017-08-18 12 views
-1

私は別のものを別の時間に出力する必要のあるプログラムを作成しています。それはランダムですが、常に同じものを出力し、はい私はsrandに入れます。srandは毎回新しい出力を初期化していません

void setcolor() 
{ 
    srand(time(NULL)); 
    int col = rand() % 4 + 1; 
    if (col == 1) 
    { cout << "white "; } 
    else if (col == 2) 
    { cout << "brown "; } 
    else if (col == 3) 
    { cout << "black "; } 
    else if (col == 4) 
    { cout << "spotted "; } 
} 

int main() 
{ 
    for (int i = 0; i <= 5; ++i) 
    { 
     setcolor(); 
    } 
} 
+1

'srand()'は、プログラムの起動時に一度だけ呼び出されるべきです。 – alain

+0

@alainなぜそれを1回だけ呼び出す必要がありますか? – ZayyanAbbas

+0

私はリンクされた質問によく徹底的な回答があります。 – alain

答えて

0

srand関数は、一度ではなく、各ループ内で呼び出さなければなりません。

void setcolor() 
{ 
    int col = rand() % 4 + 1; 
    if (col == 1) 
    { cout << "white "; } 
    else if (col == 2) 
    { cout << "brown "; } 
    else if (col == 3) 
    { cout << "black "; } 
    else if (col == 4) 
    { cout << "spotted "; } 
} 

int main() 
{ 
    srand(time(NULL)); 
    for (int i = 0; i <= 5; ++i) 
    { 
     setcolor(); 
    } 
} 

これは、srandがrand()関数で使用される「グローバル変数」を初期化するため、このように動作します。

time(null)は、1970年1月1日から経過した秒数を返します。したがって、「グローバル変数」の初期化のために同じ値を5回使用しています。

しかし、C++では、ランダムな値を使用するのは正しい方法ではありません。 代わりに使用ランダムヘッダ(http://en.cppreference.com/w/cpp/numeric/random)を好むしてください:

#include <iostream> 
#include <string> 
#include <map> 
#include <random> 

int main() 
{ 
    std::random_device rd; 
    std::map<int, int> hist; 
    std::uniform_int_distribution<int> dist(0, 9); 
    for (int n = 0; n < 20000; ++n) { 
     ++hist[dist(rd)]; // note: demo only: the performance of many 
          // implementations of random_device degrades sharply 
          // once the entropy pool is exhausted. For practical use 
          // random_device is generally only used to seed 
          // a PRNG such as mt19937 
    } 
    for (auto p : hist) { 
     std::cout << p.first << " : " << std::string(p.second/100, '*') << '\n'; 
    } 
} 
+0

ありがとう、それは働いた!なぜこれは正確に起こるのですか? – ZayyanAbbas

+0

私はいくつかの説明を追加しました;) –

0

timeによって返された値が、その精度の低いので、ランダム生成の各反復で同じままときの状況につながる可能性があなたのケースsrand(time(NULL));にシードするtimeを使用しました同じ場所から再開します。ループを開始する前に一度だけ呼び出す必要があります。

+0

異なる反復で 'time'が常に異なっていても、非ランダムなソースからRNGを連続的に再シードして、その点を打ち負かすことは明らかにひどい考えです。 –

関連する問題