0

n ( ) 個の名前のリストを生成する必要があり$size_of_listます...可能なメンバーは、$names_list名前とその名前の出現の可能性を示す配列 ( ) で指定されます。したがって、文字列と整数の 40 個の配列の配列です。

$names_list = array (
                     0 => array ('name' => "Mike", 'frequency' => 8),
                     1 => array ('name' => "Jane", 'frequency' => 7),
                     2 => array ('name' => "Leopold", 'frequency' => 1),
                     3 => array ('name' => "George", 'frequency' => 5),
...
                     39 => array ('name' => "Mark", 'frequency' => 6)
                    )

$names_list[0] = array('name' => "Mike", 'frequency' => 8)$name="Mike" は $frequency (またはチャンス) が 8 で、"Leopold" のチャンス値は 1 で、出現する確率はわずかです...

4

2 に答える 2

0

私の考えは、以前の要素'rnd'の合計を表す新しい値で配列を展開することです(最初の要素「rnd」は最初の要素の「頻度」です)$frequencyrnd

$names_list[0]['rnd'] = $names_list[0]['frequency'];
for ($i=1; $i<count($names_list); $i++)
    $names_list[$i]['rnd'] = $names_list[$i]['frequency'] + $names_list [$i-1]['rnd'];  

展開された配列は次のようになります。

$names_list = array (
                     0 => array ('name' => "Mike", 'frequency' => 8, 'rnd' => 8),
                     1 => array ('name' => "Jane", 'frequency' => 7, 'rnd' => 15),
                     2 => array ('name' => "Leopold", 'frequency' => 1, 'rnd' => 16),
                     3 => array ('name' => "George", 'frequency' => 5, 'rnd' => 21),
//... other elements
                     39 => array ('name' => "Mark", 'frequency' => 8, 'rnd' => $sum_of_all_frequencies)
                    )

そして、 $rand_max を最後の要素の値に設定し、すべての値'rnd'を比較してフィナーレリストを作成します...$random'rnd'

$rand_max = $names_list[count($names_list)-1]['rnd'];

for ($i=1; $i<$size_of_list; $i++)
{
    $random = rand (1, $rand_max);
    $result = $names_list[0]['name'];
    foreach ($names_list as $key => $val)
        if ( ($random) > ($val['rnd']) )
            $result = $names_list[$key+1]['name'];

    $list[$i] = $result;
}

この解決策は機能しますが、より良い(よりスマートな)方法があると思います...
助けや提案をいただければ幸いです...

于 2013-07-08T14:11:23.393 に答える