0

私は1000個の数字があるマルチマップを持っています。今、乱数を生成する必要があります。その 560 と言います。次に、配列の 560 番目の要素を取得します。ランドを使用しました。

int number = 0;
int size = mmap.size();
int rand = rand() % size + 1;

しかし、問題は、このプログラムを n 回実行していることです。毎回、同じ数のランダム値を取得しています。プログラムを実行するたびにランダムな値を生成する方法。

  i tried using including random library. it gave error when i compile.
4

3 に答える 3

8

あなたはsrandを忘れました。

srand(time(NULL))

これをコードの先頭に追加します。一度だけ呼び出す必要があります。現在の時刻に基づいてシードされます。そこに時間(NULL)があるので、time.hを含める必要があります

于 2013-02-26T17:49:25.920 に答える
4

乱数に何かをシードする必要があります。試すsrand (time(NULL));

于 2013-02-26T17:49:32.930 に答える
1

乱数ジェネレーターをシードすることに加えてrand()、可能であれば完全に避けることをお勧めします。これは通常、非常に優れた pRNG ではなく、一般的な使用法 ( などrand() % size) では偏った結果が生成されます。より良い代替手段があれば、標準の C++<random>ライブラリを使用することをお勧めします。

<random>以上のいくつかの利点rand()

  • さまざまなニーズに合わせて明確に定義された特性を持ついくつかのエンジン。
  • 独自のディストリビューションを作成するよりも正しく使用する方が簡単です。
  • スレッド化されたプログラムで明確に指定された動作。

例:

#include <random>
#include <iostream>
#include <functional>

int main() {
    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937 e(seed);

    int size = 10;
    std::uniform_int_distribution d(1,size);

    std::cout << d(e) << '\n';
}

使用法に適している場合は、すべてを単一の関数オブジェクトにバインドすることもできます。

#include <functional>

std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};

auto rand = std::bind(std::uniform_int_distribution<>(1,size),
                      std::mt19937(seed));
std::cout << rand() << '\n';
于 2013-02-26T18:15:49.747 に答える