web-dev-qa-db-ja.com

rand()は、プログラムが実行されるたびに同じ数値を返します

乱数生成を含む、このかなり基本的なC++コードスニペットで:

include <iostream>
using namespace std;

int main() {
    cout << (Rand() % 100);
    return 0;
}

常に41の出力が得られるのはなぜですか? 0から100の間の乱数を出力するようにしようとしています。たぶん、Rand関数がどのように機能するのか理解していないのでしょうか。

23
codedude

ジェネレータを「シード」する必要があります。この短いビデオをご覧ください、それは物事をクリアします。

https://www.thenewboston.com/videos.php?cat=16&video=175

13
Aaron

seed を変更する必要があります。

int main() {

    srand(time(NULL));
    cout << (Rand() % 101);
    return 0;
}

srandの種付けは、c言語コードに対しても当てはまります。


参照: http://xkcd.com/221/

34
0x90

価値があるのは、0から99までの数値のみを生成することです(包括的)。 0から100の間の値を生成する場合は、必要になります。

Rand() % 101

他の人が述べたようにsrand()を呼び出すことに加えて。

10
DuncanACoulter

番号をシードしていません。

これを使って:

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    srand(static_cast<unsigned int>(time(0)));
    cout << (Rand() % 100) << endl;
    return 0;
}

ただし、一度シードするだけで済みます。基本的に、すべての乱数をシードしないでください。

6
user1870398

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/

6
user1655874

ボーランドコンパイラのようなランダム関数

using namespace std;

int sys_random(int min, int max) {
   return (Rand() % (max - min+1) + min);
}

void sys_randomize() {
    srand(time(0));
}
4
Alexey Ryabinin