PHP 根据值频率生成数组
PHP Generate Array based on Value Frequency
我正在尝试了解根据值应出现的频率构建有序值数组的最佳方法。根据字符的频率和顺序不相关,结果数组可能有零到一些重复字符。以下是示例数据的细分:
字符频率
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()
方法是为了避免这个 post 我尝试过的所有不同的令人发指的数学方法,以保持问题的直接性和概念性。
$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
我正在尝试了解根据值应出现的频率构建有序值数组的最佳方法。根据字符的频率和顺序不相关,结果数组可能有零到一些重复字符。以下是示例数据的细分:
字符频率
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()
方法是为了避免这个 post 我尝试过的所有不同的令人发指的数学方法,以保持问题的直接性和概念性。
$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