ホーム>source

ランダム関数を使用する必要がありますが、異なるデバイス(PC/iOS/Android)で繰り返し使用する必要があります。 ベクトルをシャッフルするために、このサンプルコードを実行しています。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
int main() {
    std::mt19937 generator(1337);
    std::cout << "Your seed produced: " << generator() << std::endl;
    std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    std::shuffle(v.begin(), v.end(), generator);
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";
    return 0;
}

からの出力 異なるPC(Windows):

Your seed produced: 1125387415
10 6 8 1 7 2 4 3 5 9

iOSからの出力:

Your seed produced: 1125387415
9 1 4 6 7 8 5 3 10 2

なぜ異なる結果が得られるのですか? OS自体に関連する別の依存関係はありますか? これをクロスプラットフォームで動作させるにはどうすればよいですか?

あなたの答え
  • 解決した方法 # 1

    std::mt19937  は規格によって厳密に定義されており、プラットフォーム固有/実装によって定義された動作の余地がないため、問題はここにありません。

    問題は std::shuffle にあります 、決して言わないどうやって 乱数ジェネレーターを使用することになっています。持っている それを使用します。

    残念ながら、再現可能なシャッフル動作が必要な場合は、独自のシャッフル動作を実装する必要があります。

  • 解決した方法 # 2

    ザ・ウィズウィズ  関数の3番目の引数が変更されました。 [0、n)の範囲の値を返す関数オブジェクトでした。つまり、 std::shuffle を渡すことができます 。今では std::uniform_int_distribution のようなランダムなビットソースが必要です 。あなたの図書館はどちらを期待していますか?

    std::mt19937

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ VB6は大きなスペースに乗る