どのような関数名を付けるべきなのでしょうか?
比重(比率)を利用して乱数を取得したいと思って、
そのような関数を探してたのですが見つからなかったので自作したのですが、
関数名の付け方に迷いがあるのでアドバイス頂けないでしょうか?
例えば
array(
array('weight' => 3, 'min' => -3, 'max' => -1),
array('weight' => 7, 'min' => 4, 'max' => 5),
)
と値を渡せば、
30%の確率で-3から-1の間でランダムした結果を取得
70%の確率で4から5の間でランダムした結果を取得
できます。
比重(weight)を利用してるので
「randByWeight」
と仮に名前を付けたのですが、
自分としてはそもそも文法的に合ってるのかも曖昧ですし、
プログラム的な命名規則に則してるかも分かりません・・・
まあそんなに深く考えずに「myrand」とかでもいいんでしょうけど、
この関数の作り方や設計の誤りなども含めてアドバイスして頂きたいです。
/**
* randByWeight
*
* @param $params
* @return int
*/
function randByWeight($params)
{
if (!isset($params[0])) {
$params = array($params);
}
$index = 0;
$range = array();
foreach ($params as $param) {
if ($index >= 1){
$range[$index]['start'] = $range[$index - 1]['end'] + 1;
} else {
$range[$index]['start'] = 1;
}
$range[$index]['end'] = $range[$index]['start'] - 1 + (isset($param['weight']) ? $param['weight'] : 1);
$index++;
}
// srand( (int)( ((float)microtime()) * 1000000 ) );
$ran = rand(1, $range[$index - 1]['end']);
for ($i = 0; $i < $index; $i++) {
if ($range[$i]['start'] <= $ran && $ran <= $range[$i]['end']) {
if (isset($params[$i]['recursive']) && is_array($params[$i]['recursive'])) {
return randByWeight($params[$i]['recursive']);
} else {
if($params[$i]['min'] > $params[$i]['max']) {
$params[$i]['min'] = $params[$i]['max'];
}
return rand($params[$i]['min'], $params[$i]['max']);
}
}
}
}
// 使用例
$arr = array(
array('weight' => 3, 'min' => -10, 'max' => 1),
array(
'weight' => 1,
'recursive' => array(
array('weight' => 1, 'min' => 2, 'max' => 2),
array(
'weight' => 10,
'recursive' => array(
array('weight' => 3, 'min' => 3, 'max' => 3),
array('weight' => 7, 'min' => 4, 'max' => 4),
),
),
),
),
);
$result = array();
for ($i = 1; $i <= 100; $i++) {
$result[randByWeight($arr)]++;
}
$sum = 0;
ksort($result);
foreach ($result as $value => $cnt) {
print "{$value}:{$cnt}<br>\n";
$sum += $cnt;
}
print "sum={$sum}<br>\n";
お礼
御回答ありがとう御座います。 仰るとおり、 $ids[] = $array['id']; にしたいんですが、 実際にやりたい処理は、「$array」の部分が「配列を返す関数」なんです。 もし、array_key_exists()が値を返すなら、↓のような記述ができるんですが。。。 $ids[] = array_key_exists('id',function()); 簡単に言うと、関数が配列を吐いた時、インデックス指定して受け取りたいんでが、スマートな方法ありますでしょうか?