5

Windows、Mac、Linux、iOS、および Android で特定のシードに対して同じ結果を生成する「乱数」ジェネレーターが必要です。今試しstd::randてみboost::random_int_generatorましboost::mt19937たが、残念ながらWindowsとMacで結果が異なります。

すべてのプラットフォームで確実に動作する (C++) 実装を知っている人はいますか?

編集1:

より具体的には、boost::mt19937Windows と Mac の数値の違いは、Windows では (2) 追加の数値ブロックが生成されていることを示しています。これらのブロックは Windows にのみ存在するため、数字の大部分は同じであるため、非常に奇妙に見えます。

編集2:

boost::mt19937すべてのプラットフォームで確実に動作します。私たちの問題はバグではありませんでした。

4

3 に答える 3

3

http://www.pcg-random.org/から PCG-Random を試してみてください。

まともな、高速、ポータブル

于 2015-06-04T23:46:40.410 に答える
3

高品質のRNGが必要ない場合は、ここの説明に従ってワンライナーとして自分で実装できます: https://en.wikipedia.org/wiki/Linear_congruential_generator、しかし多くの実用的な目的では問題ありません。

保証されたサイズの型 (uint32_t など) のみを使用することに注意している限り、すべてのプラットフォームで問題ないはずです。

より高品質の RNG が必要な場合は、Mersenne Twister ( https://en.wikipedia.org/wiki/Mersenne_Twister ) を自分で実装することもできますが、より複雑になります。

さらに別の方法は、PRNG として AES (または Chacha20 などの他のブロック暗号) を CTR モードで (事前定義されたキーを使用して) 使用することです。それは最もよく知られている (暗号化された) 品質になります :-)。あなたの側で多くのコーディングは必要ありませんが、AES 実装をリンクする必要があります (それらは広く利用可能です)。

編集: 暗号ベースの PRNG を説明する擬似コードの例:

class CryptoBasedPRNG {

 uint128_t key;
 uint128_t count;

 CryptoBasedPRNG(whatever-type seed) {
   //derive key and initial counter from seed
   //  we'll be using SHA256, but any other split should do (like odd bits/even bits of seed)
   uint256_t sha = sha256(seed);
   key = low_128bits(sha);
   count = high_128bits(sha);
  }

  uint128_t random_128_bits() {
    count += 1;//with wraparound
    return aes128(key,count);//encrypting 'count' as input data for aes128 (in ECB mode, if anybody asks about mode at this point)
  }
}

かなり簡単で非常にランダムです。

于 2015-06-04T16:46:28.013 に答える
2

異なる数字は、glm私たちが使用したコードの一部になりました。引数評価の順序は不定です。これは、ほぼランダムな目的には問題ありませんが、決定論的な数値が必要な場合はそうではありません (明らかに)。そのため、目的に合わせてコードを修正し、boost::mt19937Windows、Mac、Linux、Android、および iOS で正常に使用できるようにしました。

混乱させて申し訳ありません。

于 2015-06-11T12:34:04.793 に答える