shuffle関数と配列の重みづけ

配列を重みづけしてシャッフルしたいと思います。

まず、単純な配列のシャッフル。

<?php

$arr = array('SBI証券','楽天証券','カブドットコム証券','松井証券','マネックス証券','岡三オンライン証券','GMOクリック証券','ライブスター証券');

shuffle($arr);
echo $arr&#91;0&#93;. "にしました。";

?>

岡三オンライン証券にしました。

重みづけの関数。

<?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の値を狭めることで、ボラティリティを低くできると思います。