0
<?php

$gender = array(
  'Male'=>30, 
  'Female'=>50,
  'U' =>20);

$total = array_sum(array_values($gender)); 

$current = 0;
$rand = rand(1,$total);

foreach ($gender as $key=>$value)
{
    $current += $value;
    if ($current > $rand)
    {
        echo $key;
        break;
    }
}

?>

現時点では、加重パーセンテージに基づいてランダムな値を生成しようとしています。この例では、男性は 30% の確率、女性は 50%、U は 20% の確率です。コードのロジックが間違っていると感じたので、スクリプトを 100 回実行すると、通常は 30 人の男性が得られますが、そうではありませんでした。これを行うよりスマートな方法はありますか?

4

3 に答える 3

0

これを試して:

/**
 * random by rates
 * @param int $rates 
 * @param int $pow Decimal digits
 */
function randombyrates($rates,$pow){
        $much = pow(10, $pow);
    $max  = array_sum($rates) * $much;
    $rand = mt_rand(1, $max);
    $base = 0;
    foreach ($rates as $k => $v) {
        $min = $base * $much + 1;
        $max = ($base + $v) * $much;
        if ($min <= $rand && $rand <= $max) {
            return $k;
        } else {
            $base += $v;
        }
    }
    return false;
}
$gender = array(
   'Male'=>30, 
   'Female'=>50,
   'U' =>20);
echo randombyrates($gender);

幸運を!

于 2013-09-13T01:38:18.460 に答える