Kurter's Workshop

かーたーによるドミニオンのシミュレーション

ランダムとはオランダのダムと見つけたり

アイセル湖なのか?アムステルダムなのか?その心は誰にも分からない。いや、アイセル湖は役割的にダムじゃなくて堤防によって作られた湖なのでは?そうだったそうだった^^

 

とりあえず、鍛冶屋ステロの羅列のとこにある、Randomize条件の変更テストについて、補足しておいた方がいいだろうと思ったので書いています。

 

 

 

基本的には、乱数を付与する操作を行うのは、デッキのリシャッフルを行う関数のみです。捨て札のカードのそれぞれに乱数を対応させ、昇順に並べ替えることで、疑似的にリシャッフル操作を行ったものとしています。

しかし、単に乱数を付与するだけでは、同じ乱数テーブルが使われてしまうため、数回毎に同じパターンの繰り返しが見られたり、全く同じ検証を行った際に、全く同じログが得られたり、と、不都合が生じてしまいます。

そこで、Randomize処理を行うことで、選ばれる乱数テーブルをリセット(多分だけど現在時刻をミリセカンドで参照している?)して、リシャッフル操作をよりランダムに近い状態に持って行く必要があります。

 

元々は、乱数付与一個毎に乱数のランダマイズ処理をしていました。

これによって特に問題は生じていないように思えたのですが、よく考えると、これだと乱数テーブルの先頭しか参照していないことになるんですね。

あまり関係はないのですが、ライフゲーム(自身及び周囲8マスのセルの生き死にによって、次の状態のセルの生き死にが決まるという単純なルールだが、始状態の少しの違いが全く異なる終状態を引き起こす、複雑系のゲーム)の初期状態を生成する際に、同じように乱数付与一個毎にランダマイズ処理をしたところ、繰り返しパターンが出てしまったので、このことに気が付きました。参考として、載せておきます。

 

f:id:Kurter:20200808153701p:plain

Randomize条件をミスしたライフゲームの初期状態

 

このように、おそらく乱数テーブルの数毎に、繰り返しパターンになってしまっています。ここでは例示していないですが、より大きなフィールドで生成を行ったりした際に、途中からパターンが変化していたこともあり、おそらくミリセカンド単位で現在時刻を参照して、乱数テーブルが選ばれているものと思われます。(デフォルトで一個は次のテーブルに動くようになっていると思われる。)

 

ドミニオンでは、ライフゲームの初期状態生成と比較すると、一回のリッシャッフルで発行される乱数が乱数テーブルの数を超えることは考え難く、一瞬で次のリシャッフルの機会が訪れるわけでもないため、これまでの方法でもある程度はランダム性が担保されているとは思われます。

実際、非常に稀な値が観測される検証は存在するため、少なくとも10000回の検証中で明らかな繰り返しパターンが生じていることは、ほぼなかったと考えています。

 

 

ですが、より適切なランダマイズの運用としては、乱数付与一回毎ではなく、リシャッフル一回毎であると思われるので、そのように変更することにしました。

鍛冶屋ステロの羅列にある、Randomize条件変更テストは、基本的な鍛冶屋ステロでの追加検証を行い、有意な差が見られないことを確認するためのものです。

 

時系列で示していないため、明確にどの検証が条件変更後のものなのかは明示できませんが、新しいものは全てこの条件変更した後のシミュレーターで行っています。