妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ルーレットの作り方(12) 出目の偏りをなくす

imoue.hatenablog.com

「昨日このルーレットにはイカサマが横行してることがわかったので、修正していく。まず何が原因で偏ってるのか?」

(1) 仕組みの問題(3周分+1周未満のランダムな角度で回す)
(2) 1に使う乱数の精度が悪い
(3) どのマスを指すかの判定が間違っている

「今回の場合ざっと思いつくのはこんなかんじだけど、(1)の理屈は問題ないはずなのでいったん棚上げ。(2)もUE4組み込みの乱数がそんなに精度悪いとは考えにくい(自作の乱数システムならまっさきに疑う) で、(3)じゃないかなという疑いが兄の中で濃厚になったので確認した」

f:id:una_unagi:20180624004036p:plain

f:id:una_unagi:20180624004605p:plain

「角度チェックの時に、細かい数字を出すようにして、1回分ずつ回しながら確認する」

f:id:una_unagi:20180624004700p:plain

「本当は1度に半マスずつ回転させてるわけだから、2回ずつ同じ目になるのが正しいのに、そうはなってないことがわかった」

妹「なんでだろう……」

「やはり小数の誤差の問題だと思う。360を11で割っても割り切れないから、境界線ギリギリの場所でどっち側になるか、回るたびに判断が別れてる感じ。厳密にいえば何回転目にこの境界にきたらこっちっていうのは決まってるんだけど、トータルでいうと出やすい目と出にくい目があることになる」

妹「じゃあ計算方法を改善しないと……」

「それも出来なくはないけど……そもそもの話、境界線ギリギリのとこで判断がむずかしいのは当たり前の話で。根本的な問題は、境界線ギリギリのところばかり狙って止まる仕組みの方にある」

f:id:una_unagi:20180617235532p:plain

「この図のように、真横が最初と最後のマスの境界線にくる状態からスタートして、半マスずつ動かすと、2回に1回は境界線上ピッタリの位置にきちゃう。これが判定のズレを発生させてる。なので最初にちょっとだけずらしておけばいい。具体的には1マス分の4分の1の角度だけずらす。最初にずれてしまえば、そこから半マスずつ回しても境界線上にはならない。境界線上にこないから、人間が見ても判定がわかりやすいというメリットもある」

妹「角度の計算は変えないの?」

「変えない。今回の回し方なら必要ないし、たまに境界線ギリギリになるぐらいだったら、どうやっても誤差程度の違いしか出ないはず」

f:id:una_unagi:20180624010003p:plain

「BeginPlayで4分の1ずらした後の測定結果がこれ。ごく普通の偏りになってる。特に隣り合った目で極端な差がでてないところがいい」

妹「ところで……これでもし(3)が原因じゃなかった場合はどうなってたの?」

「その場合は(1)を疑って回し方を変えて試してみるとか、(2)を疑って乱数だけ1000回生成して試したりとか。思いつくのを全部試しても、無視できないほどズレる場合は……なんか根本的に方法を変えるとか、ルーレットじゃないのにするとかかなあ。何か原因はあるはずだけど、調べてそれがわかるとは限らないから。何年かして急に思い出したようにわかったりもする」