2012-02-22 5 views
3

入れ子配列の重みを使って配列をシャッフルする良いアルゴリズムとは何ですか?配列または配列の加重シャッフル?

例:

$array = array(
    array("name"=>"John", "rank"=>3), 
    array("name"=>"Bob", "rank"=>1), 
    array("name"=>"Todd", "rank"=>8), 
    array("name"=>"Todd", "rank"=>14), 
    array("name"=>"Todd", "rank"=>4) 
); 

私はランダムにシャッフル配列をしたいが、私はrank値は重量になりたいです。したがって、数字のランクが低い人は、リストの一番上にいる可能性が高くなります。

私は、配列を反復処理し、mt_rand(mt_rand(0,$value),$value)を使用して、選択された配列を引き出すように、いくつかのことを試してきましたが、私は、私は正しい軌道に乗ってるとは思わない...

はあなたが好きなものを

答えて

3

function compare($a, $b) 
{ 
    $share_of_a = $a['rank']; 
    $share_of_b = $b['rank']; 
    return mt_rand(0, ($share_of_a+$share_of_b)) > $share_of_a ? 1 : -1; 
} 

usort($array, "compare"); // Sort the array using the above compare function when comparing 
$array = array_reverse($array); 
+0

あなた自身の問題を解決したら、あなた自身の答えを受け入れるべきです。 –

+1

質問を投稿してから48時間が経過するまで、あなた自身の回答を受け入れることはできません。 –

2

試すことができます この:私はそうのように、この問題を解決することができました

function weightedshuffle ($a, $b) { 
    return rand(0, $a['rank'] + $b['rank']) <= $a['rank']; 
} 

usort($data, 'weightedshuffle'); 
+1

私はPHPの詳細を知らないが、あなたは確かにその関数を使って並べ替えできないようにする必要があり - それはです同値関係ではありません。 –

+1

http://codepad.org/gJfzxkEU - それは働く.. – gintas

+0

興味深い。まあ、同値関係ではないものを整理することがどういう意味かは分かりませんが、それがうまくいくかどうかはわかります。 –

関連する問題