乱数生成を含む、このかなり基本的なC++コードスニペットで:
include <iostream>
using namespace std;
int main() {
cout << (Rand() % 100);
return 0;
}
常に41の出力が得られるのはなぜですか? 0から100の間の乱数を出力するようにしようとしています。たぶん、Rand関数がどのように機能するのか理解していないのでしょうか。
ジェネレータを「シード」する必要があります。この短いビデオをご覧ください、それは物事をクリアします。
seed を変更する必要があります。
int main() {
srand(time(NULL));
cout << (Rand() % 101);
return 0;
}
srand
の種付けは、c
言語コードに対しても当てはまります。
価値があるのは、0から99までの数値のみを生成することです(包括的)。 0から100の間の値を生成する場合は、必要になります。
Rand() % 101
他の人が述べたようにsrand()を呼び出すことに加えて。
番号をシードしていません。
これを使って:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(static_cast<unsigned int>(time(0)));
cout << (Rand() % 100) << endl;
return 0;
}
ただし、一度シードするだけで済みます。基本的に、すべての乱数をシードしないでください。
srand()
は乱数ジェネレーターをシードします。シードがないと、ジェネレータは探している数字を生成できません。乱数の必要性がセキュリティクリティカルでない場合(たとえば、暗号化など)、一般的な方法は、<ctime>
ライブラリのtime()
関数を使用してシードとしてシステム時間を使用することです。など:srand(time(0))
。これは、Unixタイムスタンプ(つまり1970/1/1からの秒数)で表されるシステム時間を乱数ジェネレーターにシードします。 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/
ボーランドコンパイラのようなランダム関数
using namespace std;
int sys_random(int min, int max) {
return (Rand() % (max - min+1) + min);
}
void sys_randomize() {
srand(time(0));
}