PHP基于价值频率生成阵列

PHP基于价值频率生成阵列

问题描述:

我想了解最好的方法来建立一个有序的值的数组,基于它们应该发生的频率。根据字符的频率和顺序不相关,所得到的数组可能有零到某些重复字符。下面是示例数据的细目分类: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)]; 
} 

很酷,看看有没有人有这样做的更有效的方法。我相信有一个存在。

$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