확률 이론 및 통계에서, 시뮬레이션 된 임의의 이벤트는 종종 특정 분포와 일치하는 임의 숫자의 생성을 요구합니다. PHP가 제공하는 LCG_VALUE () 함수는 간격 [0,1) 내에 균등하게 분포되는 의사 랜덤 부동 소수점 번호를 생성 할 수 있습니다. 이 기사는 분포 함수와 결합 된 LCG_VALUE ()를 사용하여 간단한 확률 모델을 생성하고 예제를 통해 유용한 방법을 보여주는 방법을 소개합니다.
LCG_VALUE () 는 PHP에서 내장 된 의사 랜덤 수 생성 기능입니다. 선형 합동 발전기를 기반으로하며 [0, 1) 간격으로 골고루 분포 된 부동 소수점 번호를 반환합니다. 이 기능을 사용하면 균일 한 임의의 이벤트를 시뮬레이션 한 다음 변환을 통해보다 복잡한 분포를 달성 할 수 있습니다.
<?php
$randNum = lcg_value();
echo $randNum; // 산출 0 도착하다 1 사이의 부동 소수점 번호
?>
확률 모델은 종종 랜덤 변수의 누적 분포 함수 (CDF)를 정의합니다. 대상 분포가있는 CDF가있는 경우 , 균일 랜덤 변수가 주어지면 , 계산에 의해 (즉, 역 함수 변환) 대상 분포와 일치하는 랜덤 변수를 얻을 수 있습니다.
간단히 말하면 :
lcg_value ()를 사용하여 균일 랜덤 숫자를 생성하십시오
대상 분포를 사용한 역 CDF 기능 대상 분포의 랜덤 숫자로 변환됩니다.
간단한 이산 랜덤 변수가 있다고 가정합니다 의 값은 {a, b, c}이고 해당 확률은 각각 {0.2, 0.5, 0.3}입니다. 이 랜덤 변수를 시뮬레이션하기 위해 lcg_value ()를 사용하는 방법은 무엇입니까?
아이디어는 :
이산 분포 (CDF)의 누적 분포 함수 구성
균일 한 랜덤 번호 생성 u = \ text {lcg_value} ()
~에 따르면 출력 할 이벤트를 결정하는 간격
<?php
function sampleDiscrete() {
$u = lcg_value();
if ($u < 0.2) {
return 'A'; // 0 <= u < 0.2
} elseif ($u < 0.7) { // 0.2 <= u < 0.7 (0.2 + 0.5)
return 'B';
} else { // 0.7 <= u < 1
return 'C';
}
}
// 테스트를 실행하십시오
$results = ['A' => 0, 'B' => 0, 'C' => 0];
for ($i = 0; $i < 10000; $i++) {
$sample = sampleDiscrete();
$results[$sample]++;
}
print_r($results);
?>
실행 후 통계 결과는 확률 {0.2, 0.5, 0.3}에 근사합니다.
연속 분포의 경우 항 -CDF 방법도 적용됩니다. 예를 들어 지수 분포는 다음과 같습니다 , CDF는 다음과 같습니다.
역 CDF는 다음과 같습니다.
기하 급수적으로 분산 된 랜덤 숫자를 생성하기 위해 lcg_value ()를 사용하는 예 :
<?php
function sampleExponential($lambda) {
$u = lcg_value();
return -log(1 - $u) / $lambda;
}
// 测试산출
for ($i = 0; $i < 5; $i++) {
echo sampleExponential(2) . "\n"; // lambda = 2
}
?>
lcg_value ()는 확률 시뮬레이션의 기초 인 균일하게 분산 된 랜덤 숫자를 생성합니다.
대상 분포 또는 역 함수의 누적 분포 함수 (CDF)와 결합하면 임의 분포를 생성하는 임의 변수가 변환 될 수 있습니다.
개별 분포는 간격으로 나누어지고 역 CDF 변환을 통해 연속 분포가 달성됩니다.
이 방법은 간단하고 실용적이며 확률 모델과 시뮬레이션 된 임의의 이벤트를 빠르게 구현하는 데 적합합니다.
보다 자세한 사용은 공식 PHP 문서를 참조하십시오 : https://gitbox.net/manual/en/function.lcg-value.php .