主な質問には 2 つの部分があります。1つは、シャッフルの仕方についてです。もう1つは、それにランダム性を追加する方法についてです。
簡単な解決策
これはおそらく、主な質問に対する最も簡単な答えです。PHP スクリプトのほとんどの場合、これで十分です。ただし、すべてではありません (以下を参照)。
function /*array*/ seedShuffle(/*one dimentional array*/ $array, /*integer*/ $seed) {
$tmp = array();
for ($rest = $count = count($array);$count>0;$count--) {
$seed %= $count;
$t = array_splice($array,$seed,1);
$tmp[] = $t[0];
$seed = $seed*$seed + $rest;
}
return $tmp;
}
上記の方法は、可能なすべてのシード配列の組み合わせに対して真のランダムシャッフルを生成しませんが、実行できます。ただし、本当にバランスを取りたいのであれば、PHPは選択すべきではないと思います.
上級プログラマ向けのより便利なソリューション
André Laszlo が述べたように、ランダム化はトリッキーな作業です。通常は、専用のオブジェクトに処理させるのが最善です。私のポイントは、シャッフル関数を書くときにランダム性を気にする必要はないということです。シャッフルで必要な乱数の程度に応じて、多数の PseudoRandom オブジェクトから選択できます。したがって、上記は次のようになります。
abstract class PseudoRandom {
protected abstract function /*integer*/ nextInt();
public function /*integer*/ randInt(/*integer*/ $limit) {
return $this->nextInt()%$limit;
}
}
function /*array*/ seedShuffle($array, /*PseudoRandom Object*/ $rnd) {
$tmp = array();
$count = count($array);
while($count>0) {
$t = array_splice($array,$rnd->randInt($count--),1);
$tmp[] = $t[0];
}
return $tmp;
}
さて、この解決策は私が投票するものです。ランダム化コードからシャッフル コードを分離します。必要なランダムの種類に応じて、PseudoRandom をサブクラス化し、必要なメソッドと好みの式を追加できます。また、同じシャッフル関数が多くのランダム アルゴリズムで使用される可能性があるため、1 つのランダム アルゴリズムが異なる場所で使用される可能性があります。