BUSINESS LIFE TECHNOLOGY MY MIND

【UEFN/Verse言語】シードあり擬似乱数生成器

2026年8月7日

悩んでいる人
悩んでいる人

UEFN/Verse言語でシードあり擬似乱数生成器を実装する方法を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOS(Linuxカーネル)の授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
  • プログラミング歴15年以上,習得している言語: C/C++PythonSolidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,aarch64).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開
  • 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
  • 最近は自然言語処理AIイーサリアムに関する有益な情報発信や,Unreal Editor for Fortnite(UEFN)でゲーム開発に従事.
    • (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でChatGPT/Geminiを訓練するプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
    • (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
    • UEFNで10本以上のゲームを開発し,フォートナイト上で公開(FortniteFortnite.GG).

こういった私から学べます.

UEFNでランダムダンジョンなどを作成する場合,デバッグ時に同じ生成結果を再現したいことがあります.

本記事では,シードを指定できる擬似乱数生成器my_seeded_random_generatorをVerse言語で実装します.

ゲーム本番ではVerse標準のRandomモジュールを利用し,本実装は主にデバッグや再現テストで利用します.

【UEFN/Verse言語】シードあり擬似乱数生成器とは

シードあり擬似乱数生成器とは,シードと呼ばれる初期値から擬似乱数を生成する仕組みです.

シードは,擬似乱数生成器の内部状態(次の擬似乱数を計算するために保持する値)を初期化するために利用します.

同じシードを設定して,同じ順番で乱数を生成すると,同じ結果を再現できます.

例えば,あるシードから以下の値が生成された場合,

再度同じシードを設定すると,同じ乱数列を生成できます.

VerseのRandomモジュールには,以下の関数があります.

GetRandomInt()GetRandomFloat()で乱数を生成し,Shuffle()で配列をランダムに並べ替えられます.

一方で,任意のシードを設定する公開関数はありません.

そのため,同じ生成結果を再現したい場合は,シード付きの擬似乱数生成器を別に実装する必要があります.

シードあり擬似乱数生成器の用途

シードあり擬似乱数生成器の主な用途はデバッグです.

例えば,ランダムダンジョンで特定のシードだけ進行不能になる場合,シードを固定すると同じダンジョンを何度でも生成できます.

また,以下の用途にも利用できます.

  • ランダムダンジョンの再現
  • 敵やトラップ配置の再現
  • アイテム抽選のテスト
  • バグの再現
  • 回帰テスト
  • Daily Seedなどの固定マップ

ただし,ゲーム本番で再現性が不要な場合は,Verse標準のRandomモジュールを利用します.

メルセンヌ・ツイスタをVerseで実装するのが難しい理由

C言語 乱数生成
【C言語】rand関数と自作関数で乱数の生成【モンテカルロ法で円周率の計算】

こういった悩みにお答えします. こういった私から学べます. 乱数 乱数はランダムな数を意味します. 乱数の特徴として,偏りがないことや再現性がないことが要求されますが,コンピュータの計算による乱数生成 ...

続きを見る

上記のC言語の記事で紹介したメルセンヌ・ツイスタは高品質な擬似乱数生成器ですが,以下のようなビット演算を多用します.

Verseでは,C/C++のような整数のビット演算をそのまま利用しにくいため,これらを独自に再現する必要があります.

ビットごとのループ処理が必要になるため,実装が複雑になり,処理量も多くなります.

シードあり擬似乱数生成器にMRG32k3aを選定した理由

MRG32k3aは,1999年にピエール・ルクワイエが提案した,2つの多重再帰型擬似乱数生成器を組み合わせた方式です.

主な特徴は以下になります.

  • ビット演算が不要
  • 整数の乗算,減算,剰余で実装できる
  • 内部状態は整数6個
  • 周期は約\(2^{191}\)
  • Verseで比較的軽量に実装できる

ランダムダンジョンのデバッグ用途では,十分な周期と乱数品質があります.

メルセンヌ・ツイスタと比較すると,以下になります.

項目MRG32k3aメルセンヌ・ツイスタ
主な演算乗算,減算,剰余ビット演算
内部状態6個624個
Verseでの実装比較的簡単複雑
周期十分に長い非常に長い

Verseで利用する場合は,MRG32k3aの方が実装しやすいと考えました.

my_seeded_random_generatorのVerse実装

my_seeded_random_generatorのVerse実装を紹介します.

実装するクラスと関数は以下になります.

Verse標準のRandomモジュールと区別するために,関数名にはMyを付けています.

私の実装は以下になります.

MyGetRandomInt()では,生成する整数の範囲がMRG32k3aの1回の出力範囲以内であることを想定しています.

my_seeded_random_generatorの使い方

my_seeded_random_generatorの使い方を紹介します.

以下の例では,同じシードから同じ値を生成できることを確認した後,MyGetRandomInt()MyGetRandomFloat()MyShuffle()を利用します.

FirstValueSecondValueには同じ値が出力され,その後に整数,浮動小数点数,シャッフルした配列が出力されます.

本実装で同じシードと同じ呼び出し順を利用した場合,実行結果は毎回以下になります.

Print関数の表示は,メッセージログのVerseの診断で確認できます.

ファイルパス,行番号,タイムスタンプ等は省略しています.

my_seeded_random_generatorの使用時の注意点

my_seeded_random_generatorを利用する場合は,擬似乱数を生成する順番に注意してください.

同じシードを設定しても,乱数関数の呼び出し順や回数が変わると,その後に生成される擬似乱数も変わります.

例えば,以下の順番で擬似乱数を利用しているとします.

1.部屋
2.敵
3.トラップ

途中に装飾用の乱数処理を追加すると,以下になります.

1.部屋
2.装飾
3.敵
4.トラップ

乱数関数の呼び出しが1回増えるため,敵やトラップに利用される擬似乱数も変化します.

そのため,大規模なランダムダンジョンでは,用途ごとに擬似乱数生成器を分ける方法がおすすめです.

また,同じmy_seeded_random_generatorインスタンスに対する乱数生成処理はリエントラント(処理の実行途中に同じ処理が再び呼び出されても,互いに干渉せず正しく動作できる性質)ではありません.

擬似乱数を生成するたびに内部状態を書き換えるため,同じインスタンスを複数の並行処理から利用すると,乱数を生成する順番によって結果が変化する可能性があります.

並行処理で利用する場合は,処理ごとに異なるmy_seeded_random_generatorのインスタンスを利用しましょう.

参考:Epic Developer Communityの擬似乱数生成器との比較

Epic Developer Communityには,TyrantKingBenが実装したシードあり擬似乱数生成器があります.

こちらは文字列シードとSFC32を利用した実装です.

SFC32自体は軽量な擬似乱数生成器ですが,ビット演算を利用します.

そのため,Verse実装では以下のような処理を独自に再現しています.

ビット演算をループで再現するため,Verse上では処理量が多くなります.

比較すると以下になります.

項目本記事のMRG32k3a実装Epic Developer CommunityのSFC32実装
シードintstring
主な演算乗算,減算,剰余XOR,シフト,OR
ビット演算の再現不要必要
Verse上の処理量比較的少ない比較的多い
文字列シード非対応対応
デバッグ用途適している適している

文字列をそのままシードにしたい場合は,SFC32の実装が便利です.

一方で,整数シードで問題なく,Verse上でビット演算の再現を避けたい場合は,MRG32k3aが適しています.

まとめ

UEFN/Verse言語で,シードあり擬似乱数生成器を実装する方法を紹介しました.

ランダムダンジョンなどのデバッグではmy_seeded_random_generatorを利用し,ゲーム本番ではVerse標準のRandomモジュールを利用するように使い分けましょう.

私がUnreal Editor for Fortnite(UEFN)で開発した,フォートナイトで遊べるゲームをしたいあなたはこちらからどうぞ.

UEFN フォートナイト ゲーム
【無料】私がUnreal Editor for Fortnite(UEFN)で開発した,フォートナイトで遊べるゲーム

こういった私から学べます. 私がUnreal Editor for Fortnite(UEFN)で開発した,フォートナイトで遊べる無料ゲームを紹介します. 是非,私のゲームで遊びましょう! まずはUE ...

続きを見る

-BUSINESS, LIFE, TECHNOLOGY, MY MIND
-, , , , , , ,