どのランダム配列のPHPを使用せずシャッフル()機能しているのでしょうか。
質問
ったとても良いタイミングでの質問に就職面接を行います。面接官には、私は日本のような正しい答えをしました。ったい任意のデータを用されます。
更新:ったものについて、承認申請のためにのシャッフルしました厳しく禁止され...います。
解決
ご利用可能に フィッシャー-イェイツシャッフル.
他のヒント
shuffle($arr);
:)
編集:かを明確にすべきである...私の定義のベスト的なアルゴリズムの効率がコードの可読性、保守性です。利用標準ライブラリの機能を低コードを読んでいます。を超えるときには、長年の議論博士課程修了教授の"真ランダム"機能で、人は常に同意できないときのランダム化。
もに解決した:
function randomize_array_1($array_to_randomize) {
$new_array = array();
while (count($array_to_randomize) > 0) {
$rand_num = rand(0, count($array_to_randomize)-1);
$extracted = array_splice($array_to_randomize, $rand_num, 1);
$new_array[] = $extracted[0];
}
return $new_array;
}
ここで、この日の彼の解
function randomize_array_2($array_to_randomize) {
usort($array_to_randomize, "rand_sort");
return $array_to_randomize;
}
function rand_sort($a, $b) {
return rand(-1, 1);
}
を行ったバンチの試験法(しようと各1,000,000倍の速度差ができる。しかし、チェックイン時のランダムネスの結果が多いのには驚いたがどのように分布した。こちらは自結果:
randomize_array_1:
[2, 3, 1] => 166855
[2, 1, 3] => 166692
[1, 2, 3] => 166690
[3, 1, 2] => 166396
[3, 2, 1] => 166629
[1, 3, 2] => 166738
randomize_array_2:
[1, 3, 2] => 147781
[3, 1, 2] => 73972
[3, 2, 1] => 445004
[1, 2, 3] => 259406
[2, 3, 1] => 49222
[2, 1, 3] => 24615
ご覧の通り、最初の方法を提供するほぼ完全な分布を示すことでよりは少真にランダムでは第二の方法はすべてのこと。
さんしかいないでしょう試験で比較的共通の間違いの多くを実施した場合には、シャッフリングアルゴリズム(また実際のセンターの 論争 件のオンラインポーカーサイト数年前)
誤った方へのシャッフル:
for (i is 1 to n)
Swap i with random position between 1 and n
正しい方法でシャッフル:
for (i is 1 to n)
Swap i with random position between i and n
グラフの確率分布のためのこれらの例では見やすい理由の第一ソリューションが間違っています。
の"正しい"はんとしない。最高速/も簡単に作の最もエレガントな)を配列するだけで、シャッフルがなくなります。
PHPには、内蔵機能-->シャッフル().はないかと感じるべきなので好きなものもがまだ完全に'random'.
チェック http://computer.howstuffworks.com/question697.htm ちょっと説明して非常に難しい取得し完全な乱数の発生源を形成します。
答え:PHPの array_rand()
機能
このシャッフル機能が禁止として使おう $keys = array_rand($myArray, count($myArray))
戻キーの配列から $myArray
されていない。からあるので簡単に組み立て新しい配列された無作為化.のようなもの:
$keys = array_rand($myArray, count($myArray));
$newArray = array();
foreach ($keys as $key) {
$newArray[$key] = $myArray[$key];
}