あなたが間違っているのは、乱数ジェネレーターの状態をリセットしていることです。
それが明らかでない理由は、あなたが時間を使っているからです。time は time_t を返します。これは、標準によれば、「現在のカレンダー時間に対する実装の最良の近似値」です。これは通常、UTC 1970 年 1 月 1 日 00:00 からの秒数を表します。これで、コードはおそらく 1 ミリ秒以内に実行されるため、すべての呼び出しで同じ値が返されます。
したがって、コードは次と同等です。
int const somenum = time(NULL);
srand(somenum); //reset state using some seed.
//rand() will always produce the same value after an
// srand call of the same seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
これをテストするには、rand への呼び出しごとにキーを押すのを待ちます。それらが異なることがわかります。
これを修正する方法は、最初に srand(time(NULL)) を 1 回だけ呼び出すことです。
さて、C++11 では別の方法があります。
#include <iostream>
#include <random>
int main()
{
const int rand_max = 20;
std::default_random_engine rng(std::random_device{}());
std::uniform_int_distribution<> dist(0, rand_max);
std::cout<<"This will always be as random a number as your hardware can give you: "<<dist(rng)<<std::endl;
return 0;
}
std::random_device は、利用可能な場合は組み込みのハードウェア乱数ジェネレーターを使用するため、時間のシードについて心配する必要はありません。本当に疑似乱数が必要な場合は、別の乱数ジェネレーターを使用してください。
C++11 で乱数分布を制御することもできます。