お風呂入ってたらこんなん思いついた。
乱数生成機から取り出す乱数をランダムに選択する機構。
名づけて鳩の巣セレクタ、通称"Pox"。いやこの名前が使いたかっただけなんですけど。
int n, result; static int Pox[3] = {0}; // rnd()は擬似乱数列から乱数を順番に取り出す関数 int PoppoBoxSelector() { result = 0; while(!result) { n = rnd(); if(Pox[n % 3] != 0) result = Pox[n % 3]; Pox[n % 3] = n; } return result; } // クラス化してPoxを管理しないと上手く書けないことに書き出してから気がついた。とりあえず簡易版ということで。
こんな感じで、乱数を用意した鳩の巣に一旦収容して、先客が居たらそれを追い出して次の鳩を収容する。
これにより乱数列からの取り出し順序がその先の乱数によって決定されるようになって
"r1,r2,r3...."となっている通常の並びから"r1,r4,r2,r5,...r3,..."みたいな予測できない順序で乱数が取り出される。
ユーザーから見ると次に取り出される乱数はrn+1〜3になるんだけどその順番はrn+4が決定しているから予測ができなくなる。
Pox数を可変にすると完璧だね。
Poxは2個から機能するけど、その場合寄寓の並び順が保存されてしまう。Poxの要素数はある程度多いほうがいい。107ぐらい?
あと生成される乱数値がPox数より大幅に大きいことも必要かな。
ってここまで書いてなんとなく気がついたんだけど、乱数の取り出し順って普通のユーザーは興味ないし
興味あるユーザーには解析されてあっさり調整されるし、変化を加える必要がないんじゃないだろうか。
乱数の質を落とさず予測しにくくするいい機構を思いついたと思ったんだけど。