- ※解説修正情報※
- ●2013-03-13:乱数の偏りについてのRandom<750のこと削除
- ●2013-03-10:乱数の偏りについての記述・再度
- ●2013-03-09:乱数の偏りについての記述
■Random【乱数】
- ▼概要
- ランダムな数値を返す。
- ▼情報・書式
- Random ;Int型
- 0~999の整数のどれかを無作為に返す。
- フレームごと・記述ごとにその都度ランダムな数値を返す。
- 「Random=0」と「Random=Random」は計算上1/1000の確率で同じ。
■Lv1-記述例・補足・注意点
- 記述例
- [State 191, random intro]
- Type = ChangeState
- Trigger1 = !Time && Random < 200
- Value = 194
- 1000分の200の確率で194へChangeStateを行う。
- 補足
- 基本的に「Random < xxx」といった方法で使う。
- 「( Random % 2 ) = 0」といった記述もある。%2=0で、1/2。
- 上書き無しなら(Random%5)=0→(Random%4)=0→(Random%3)=0→(Random%2)=0→1
という確率記述で5個全てを約1/5の確率にできる。
- 上書き有りの場合は1→(Random%2)=0→(Random%3)=0の順で良い、はず。
- 注意点
- Randomは記述毎で個別に乱数を返すため、
ランダムで処理の分岐させたい場合はVarに代入したりする必要がある。- 一律Random<500で処理を切り替えようとしようものなら、
全てごちゃごちゃに処理され、おかしなことになる。
- 上記記述例同様、条件でChangeStateするなり、VarSetをしてVar()で対応するなりが必要。
- 確率の条件式は、毎フレーム確率を判定するため長時間に渡って考えると確率は上がる。
- 「Random < 500」は毎フレーム50%だが10F中1回でも当たればいいなら確率は99.9%に達する。
- 50%→50%+残りの1/2で75%→75%+残りの1/2で87.5%→
→+残りの1/2で93.75%→96.875%→…中略→99.90234…%
- 「Random < 100」でも毎フレーム10%なので、10F中1回でもいいならなら約65%程度の確率になる。
- 偏り
- 0~999の数値は、無視できる程度ではあるが偏りが存在する。
- それぞれの数値が出る確率は0.1%だが、0.1007...%と0.0976...%で分かれているとの報告。
- 分岐点は「768前後」(おそらく、767以下:768以上の分岐?)
- とはいえ、0.00X%程度の誤差であるため気にする必要はないかと。
- 一応( Random % 100 )や( Random % 10 )などで使う数値を減らせばと偏りは限りなく少なくなる。
- 偏りの原因
- 乱数は基本15bit管理?で「0~32767」の数値から0~999の数値を作っているみたい。
- 15bit最大値を1000で割った余り下三桁、767までが僅かに確率が高くなっているみたい?
- もしかしたら:マイナス含む16bitでマイナス値反転処理での処理かも
- 数式(※Google電卓推奨):推測する確率の偏り(16bitで反転含む場合も大差無し?)
- ( (1/( 2**15 -1 ) ) * 32 ) =0.0009765923 : 1/32767 * (32)の数値(1000で割れる最大整数)
- ( (1/( 2**15 -1 ) ) * 33 ) =0.00100711081 : 1/32767 * (32+1)の数値(+1は下三桁767の分)
- ( ( (1/( 2**15 -1) ) * 33 )*(767) + ( (1/( 2**15-1 ) ) * 32 )*(1000-767) =1
- AI制作時の注意点
- Randomの確率でAIの動作を制限する際はRandom<100でも全体がその程度なら確率はそこまで低くない。
- 「Random < 500」以上の確率であればほぼ確実と思って良い程度。
- Random<100の行動でも5個書いてあれば、2F中に行動する確率は約65%。10Fもあればほぼ確実。
- ただ猶予の短いコンボなどであれば、そこまで確率は上がらない。
最終更新:2017年10月02日 22:35