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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]