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';
}
}
'srand()'は、プログラムの起動時に一度だけ呼び出されるべきです。 – alain
@alainなぜそれを1回だけ呼び出す必要がありますか? – ZayyanAbbas
私はリンクされた質問によく徹底的な回答があります。 – alain