복권 시스템에 적합
- /*
- * 1만분의 1까지 정확한 복권 카테고리
- * 3단계: 1. 당첨 확률 배열을 수락합니다. 로또 시드 수락; 3. 당첨 레벨 반환
- */
- class Lottery {
- /*
- * 당첨 확률 배열, 자동으로 상품 수 결정
- * 배열 키 value 합은 100이며, 당첨되지 않을 확률은 자동으로 계산됩니다. 초기 값이 100을 초과하면 오류가 발생합니다.
- */
- protected $_rate = array();
- /*
- * 당첨 확률 설정
- * @param Array, 당첨 확률을 배열로 전달
- */
- 공개 함수 setRate($rate = array(12.1, 34)) {
- $this->_rate = $rate;
- if (array_sum($this->_rate) > 100)//확률에 문제가 있는지 확인 설정
- throw new Exception('승률 최대 100%');
- if (array_sum($this->_rate) < 100)
- //승하지 못할 확률을 정의합니다. 사용자가 제공한 값의 합은 100, 0 무시
- $ this->_rate[] = 100 - array_sum($this->_rate);
- }
-
- /*
- * 1부터 10000까지의 정수 시드를 무작위로 생성하여 승리 판정 함수에 제출
- * @return int, 전달된 확률로 정렬, 당첨 항목 수 반환
- */
-
- public function runOnce() {
- return $this->judge(mt_rand (0, 10000));
- }
-
- /*
- * 설정된 확률에 따라 수신 여부를 결정합니다. 임의의 값이 승자입니다
- * @param int,$seed 10000 이내 난수
- * @return int,$i는 전달된 확률로 정렬하여 당첨된 항목의 개수를 반환합니다
- */
-
- 보호 함수 Judge($seed) {
- foreach ($ this->_rate as $key => $value) {
- $tmpArr[$key 1] = $value * 100;
- }
- // 확률에 10을 곱하고 무작위 선택을 위해 누적하여
- $tmpArr[0] = 0;
- foreach ($tmpArr as $key => $value) {
- if ($key > 0) {
- $tmpArr[$ key] = $tmpArr[$key - 1];
- }
- }
- for ($i = 1; $i < count($tmpArr); $i ) {
- if ($ tmpArr[$i - 1] < $seed && $seed <= $tmpArr[$i]) {
- return $i; //당첨 아이템 개수 반환(확률 설정한 순서대로)
- }
- }
- }
- }
- $rate = array(33, 20, 2 , 0.95, 12, 4.55);
- $a = 새로운 복권 ;
- $a->setRate($rate);
- for ($i = 0; $i <= 10000 ; $i ) {
- $b = $a->runOnce() ;
- @$rewards[$b] ;
- }
- unset($rewards['']);
- echo array_sum($rewards);
- ?>
- < html>
-
-
-
- < ;body>
-
- 10,000회 실행하여 설정된 확률과 당첨 횟수를 비교합니다< /thead>
-
확률 설정 | 당첨 횟수
---|
-
php echo $rate[0] ?>% | |
-
% | tr>
-
% | |
-
% | |
-
% | < ;td>
-
| |
-
| |
-
-
|