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