乱数生成を含むこのかなり基本的なC++コードスニペットでは、次のようになります。
include <iostream>
using namespace std;
int main() {
cout << (rand() % 100);
return 0;
}
なぜ私は常に41の出力を取得しているのですか?0〜100の乱数を出力しようとしています。おそらく、rand関数がどのように機能するかについて何か理解していないのでしょうか。
シードを変更する必要があります。
int main() {
srand(time(NULL));
cout << (rand() % 101);
return 0;
}
シードは言語コードsrand
にも当てはまります。c
参照:http: //xkcd.com/221/
ジェネレーターを「シード」する必要があります。この短いビデオをチェックしてください、それは物事を片付けるでしょう。
その価値のために、あなたは0から99(両端を含む)の間の数だけを生成しています。0から100の間の値を生成したい場合は、必要になります。
rand() % 101
他の人が言及したようにsrand()を呼び出すことに加えて。
srand()
乱数ジェネレーターをシードします。シードがないと、ジェネレーターは探している数値を生成できません。乱数の必要性がセキュリティ上重要でない限り(たとえば、あらゆる種類の暗号化)、一般的な方法は、ライブラリのtime()
関数を次のように使用して、システム時間をシードとして使用することです。これにより、Unixタイムスタンプ(つまり、1970年1月1日からの秒数)として表されたシステム時刻で乱数ジェネレーターがシードされます。次に、を使用して疑似乱数を生成できます。<ctime>
srand(time(0))
rand()
これは重複した質問からの引用です:
その理由は、rand()関数から生成された乱数が実際にはランダムではないためです。それは単に変革です。ウィキペディアでは、疑似乱数ジェネレーターの意味についてより適切に説明しています。決定論的ランダムビットジェネレーターです。rand()を呼び出すたびに、生成されたシードおよび/または最後の乱数を取得します(C ++ 11にはいくつかの一般的なアルゴリズムを指定する機能がありますが、C標準では使用されるアルゴリズムは指定されていません)。それらの数値に対する数学演算、および結果を返します。したがって、シードの状態が毎回同じである場合(真に乱数を使用してsrandを呼び出さない場合のように)、常に同じ「乱数」が出力されます。
詳細を知りたい場合は、以下を読むことができます。
http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/
http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/
あなたは番号をシードしていません。
これを使って:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(static_cast<unsigned int>(time(0)));
cout << (rand() % 100) << endl;
return 0;
}
ただし、シードする必要があるのは1回だけです。基本的に、すべての乱数をシードしないでください。
ボーランドコンパイラのようなランダム関数
using namespace std;
int sys_random(int min, int max) {
return (rand() % (max - min+1) + min);
}
void sys_randomize() {
srand(time(0));
}