2017-04-18 13 views
1

私は発生する頻度に基づいて順序付けられた値の配列を構築する最良の方法を理解しようとしています。結果の配列は、文字の頻度に基づいてゼロからいくつかの繰り返し文字を持つことができ、順序は関係ありません。PHPは値の頻度に基づいて配列を生成します

文字周波数

a => 0.05 
b => 0.05 
c => 0.1 
d => 0.1 
e => 0.2 
f => 0.5 

結果の例:ここでは例のデータの内訳です

['b', 'd', 'a', 'f'] 
['f', 'f', 'c', 'a'] 
['e', 'c', 'a', 'f'] 
['a', 'e', 'f', 'd'] 

数学は確かにここに正確ではありません。前のステートメントを説明するだけです。私はではありません配列の順序といくつかのかもしれないは、繰り返しの文字があります。

ここに配列を構築する基本的なループがあります。ここで考案されたrand()メソッドは、私が問題を直接的かつ単なる概念的に保つために努力してきたさまざまな驚異的な数学的方法のすべてをこの投稿に入れておくことです。

$frequencies = [ 
    'a' => 0.05, 
    'b' => 0.05, 
    'c' => 0.1, 
    'd' => 0.1, 
    'e' => 0.2, 
    'f' => 0.5 
]; 

$characters = 'abcdef'; 
$charactersLength = strlen($characters); 
$result = []; 
for ($i = 0; $i < 4; $i++) { 
    // $result[] = $this->getCharacterByFrequency(); 
    $result[] = $characters[rand(0, $charactersLength - 1)]; 
} 

答えて

1

誰かがこれを行うより効率的な方法を持っているかどうかを確認してください。私は確信している。

$frequencies = [ 
    'a' => 0.05, 
    'b' => 0.05, 
    'c' => 0.1, 
    'd' => 0.1, 
    'e' => 0.2, 
    'f' => 0.5 
]; 

$result = []; 
for ($i = 0; $i < 4; ++$i) { 
    $r = mt_rand()/mt_getrandmax(); 
    foreach ($frequencies as $letter => $frequency) { 
     $r -= $frequency; 
     if ($r < 0) break; 
    } 
    $result[] = $letter; 
} 

私は100000の結果でコードをテストし、正確な結果を得ました。

array (size=6) 
'a' => float 0.0503105 
'b' => float 0.0496805 
'c' => float 0.099721 
'd' => float 0.100001 
'e' => float 0.201242 
'f' => float 0.499055 
関連する問題