乱数生成器について

ExtremeRolesで使用可能な乱数生成器についての説明です

目次

  1. 各種乱数生成器が作られるタイミング
  2. 実装済み乱数生成器
    1. Permuted congruential generator(PCG)ファミリー
    2. Xorshiftファミリー
    3. Romuファミリー
    4. その他の乱数生成器

  • ゲームオプションの「強力なシャッフルを使用する」のオプションによって乱数生成器を変更することが出来ます
    • オン
      • 全ての乱数を生成する場合、Extreme Rolesで実装されている乱数生成器を使用します
    • オフ
      • アサイン時AmongUs本体の乱数生成器
      • それ以外で乱数を生成する場合はC#で用意されている乱数生成器を使用します(System.Rand、内部表現は2の32乗 - 1です)
  • 内部状態量:これが多いほど乱数パターンが多く同じ乱数パターンが生成されにくくなります
  • 実装して欲しい物があればリクエストをお願いします(必要ならば1024ビットの乱数生成器を実装します)

乱数生成器が符号なし64ビット整数を出力した場合、32ビット符号付き整数に丸め込みを行っています

丸め込み手法は.Net6の実装を使用しています

各種乱数生成器が作られるタイミング

  • 以下のタイミングで作成されます
    • ロビーを新しく作成したタイミング
    • 「強力なシャッフルを使用する」のオプションが変更され、ゲームを開始したタイミング
    • 「使用する乱数生成アルゴリズム」を変更し、ゲームを開始したタイミング

「強力なシャッフルを使用する」のオプションのオンオフや「使用する乱数生成アルゴリズム」を切り替えるだけでは作り直されず、変更した後にゲームを開始した時に作り直されます

アルゴリズムを変更しゲームを開始すると新しいシード値で乱数生成器が作成されるのでロビーを立て直す必要はなくなります

同じタイプの乱数生成器を使用してプレイしたい場合は立て直す必要があります

実装済み乱数生成器

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の乱数生成器の中で最も小さい内部表現を持つ