乱数生成器について - yukieiji/ExtremeRoles GitHub Wiki

  • 「強力なシャッフルを使用する」のオプションのオンオフ
    • オン:全ての乱数を生成する場合、Extreme Rolesで実装されている乱数生成器を使用します
    • オフ:アサイン時AmongUs本体の乱数生成器、それ以外で乱数を生成する場合はC#で用意されている乱数生成器を使用します(System.Rand、内部表現は2の32乗 - 1です)
  • 各種乱数生成器が作られるタイミング
    1. ロビーを新しく作成したタイミング
    2. 「強力なシャッフルを使用する」のオプションが変更されゲームを開始したタイミング
    3. 生成するアルゴリズムを変更しゲームを開始したタイミング(変更して同じ乱数生成器の場合作り直されません)
      • アルゴリズムを変更しゲームを開始すると新しいシード値で乱数生成器が作成されるのでロビーを立て直す必要はなくなります
      • 同じタイプの乱数生成器を使用してプレイしたい場合は立て直す必要があります
  • 乱数生成器が符号なし64ビット整数を出力した場合、32ビット符号付き整数に丸め込みを行っています
  • 内部状態量:これが多いほど乱数パターンが多く同じ乱数パターンが生成されにくくなります
  • 実装して欲しい物があればリクエストをお願いします(必要ならば1024ビットの乱数生成器を実装します)

Permuted congruential generator(PCG)ファミリー

  • 2014年発表の乱数生成器

  • 特徴

    • 高速、省メモリ、実装が簡単
    • 乱数の表現量も高い
    • Pythonの科学演算ライブラリNumpyのデフォルト乱数生成器にも使用されている
    • PCG-RXS-M-XSはTestU01のBigCrushを理論最小表現量(72ビット=>36ビット)で合格している
  • PCG32-XSH-RRはExtreme Rolesの乱数生成器のデフォルトで選択されている

  • PCG64-RXS-M-XSは64ビット => 64ビットの物であるため上記のものと異なり弱い乱数生成器である

乱数生成器名 内部表現量
PCG32-XSH-RR 2の64乗
PCG64-RXS-M-XS 2の64乗

Xorshiftファミリー

  • 2003年発表の乱数生成器

  • 特徴

    • 実装も演算も非常にシンプルなため、非常に高速動作が可能な乱数生成器
      • 論文によれば1800MHzのPCで毎秒2.2億個の擬似乱数を生成出来る
    • Xorshift128はGoogleChromeのJavaScriptエンジンあるV8でも採用されている
  • xorshiroはXorshiftを改良したモデルである

    • xorshiro256**は.Net6で採用されている
  • xorshiro512**はExtreme Rolesの乱数生成器の中で2の512乗と最も多くの内部表現量を持つ

乱数生成器名 内部表現量
Xorshift64 2の64乗 - 1
Xorshift128 2の128乗 - 1
xorshiro256** 2の256乗 - 1
xorshiro512** 2の512乗 - 1

Romuファミリー

  • 2020年発表の比較的新しい乱数生成器

  • 特徴

    • 表現能力は非常に高く、外部テストによる実験では実装されていないRomuDual jrでも十分な性能がでる
    • 論文ではRomuTrio以上の使用が推奨されてる
  • RomuMonoはJFT32と同じくExtreme Rolesの乱数生成器の中で最も小さい内部表現を持つ

乱数生成器名 内部表現量
RomuMono 2の32乗 - 1
RomuTrio 2の196乗 - 1
RomuQuad 2の256乗 - 1

その他の乱数生成器

乱数生成器名 内部表現量 詳細
Seiran128 2の128乗 - 1 高速な動作をする乱数生成器、多くのテストに合格する
Shioi128 2の128乗 - 1 ジャンプ可能で高速な動作をする乱数生成器、多くのテストに合格する
JFT32 2の32乗 RomuMonoと同じくExtreme Rolesの乱数生成器の中で最も小さい内部表現を持つ