2017-04-18 1 views
1

발생 빈도에 따라 정렬 된 값 배열을 만드는 가장 좋은 방법을 이해하려고합니다. 결과 배열은 문자의 빈도에 따라 0에서 몇 개의 반복 문자를 가질 수 있으며 순서는 적절하지 않습니다.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 
관련 문제