配列を重みづけしてシャッフルしたいと思います。
まず、単純な配列のシャッフル。
<?php $arr = array('SBI証券','楽天証券','カブドットコム証券','松井証券','マネックス証券','岡三オンライン証券','GMOクリック証券','ライブスター証券'); shuffle($arr); echo $arr[0]. "にしました。"; ?>
岡三オンライン証券にしました。
重みづけの関数。
<?php $arr = array( 'SBI証券' => 30, '楽天証券' => 30, 'カブドットコム証券' => 5, '松井証券' => 5, 'マネックス証券' => 15, '岡三オンライン証券'=> 5, 'GMOクリック証券' => 5, 'ライブスター証券' => 5 ); function array_rand_weighted($entries){ $sum = array_sum($entries); $rand = rand(1, $sum); foreach($entries as $key => $weight){ if(($sum -= $weight) < $rand) return $key; } } $sec = array_rand_weighted($arr); echo $sec. "にしました。"; ?>
ああ、ダメだ。
やりたいのは、シャッフルした後の配列の順番の重みづけなので全然違いますね。これではどうでしょう?
係数とランダムな数を掛け合わせて、ソートします。
<?php $min = 1; $max = 10; $arr = array( 'SBI証券' => 30, '楽天証券' => 30, 'カブドットコム証券' => 5, '松井証券' => 5, 'マネックス証券' => 15, '岡三オンライン証券'=> 5, 'GMOクリック証券' => 5, 'ライブスター証券' => 5 ); foreach($arr as $key => $weight){ $result[$key] = $weight * mt_rand($min, $max); } arsort($result); var_dump($result); ?>
array(8) { [“楽天証券”]=> int(270) [“SBI証券”]=> int(120) [“マネックス証券”]=> int(60) [“ライブスター証券”]=> int(45) [“松井証券”]=> int(45) [“岡三オンライン証券”]=> int(30) [“GMOクリック証券”]=> int(20) [“カブドットコム証券”]=> int(15) }
値はさておき、近いのではないでしょうか。
$minと$maxの値を狭めることで、ボラティリティを低くできると思います。