2017-04-18 60 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