>백엔드 개발 >PHP 튜토리얼 >php_php 기술로 작성된 복권 프로그램 당첨 확률 알고리즘

php_php 기술로 작성된 복권 프로그램 당첨 확률 알고리즘

WBOY
WBOY원래의
2016-05-16 20:15:301021검색

먼저 백엔드 PHP 프로세스를 완료해 보겠습니다. PHP의 주요 임무는 상금과 해당 당첨 확률을 구성하는 것입니다. 프런트엔드 페이지가 특정 상자를 클릭하면 백엔드 PHP에 Ajax 요청이 전송됩니다. PHP는 구성된 확률에 따라 확률 알고리즘을 통해 당첨 결과를 제공하며, 당첨되지 않은 경품 정보도 JSON 데이터 형식으로 프런트 엔드 페이지에 전송됩니다.

확률 계산 기능을 먼저 살펴보겠습니다

function get_rand($proArr) { 
  $result = ''; 
 
  //概率数组的总概率精度 
  $proSum = array_sum($proArr); 
 
  //概率数组循环 
  foreach ($proArr as $key => $proCur) { 
    $randNum = mt_rand(1, $proSum); 
    if ($randNum <= $proCur) { 
      $result = $key; 
      break; 
    } else { 
      $proSum -= $proCur; 
    } 
  } 
  unset ($proArr); 
 
  return $result; 
} 

위의 코드는 고전적인 확률 알고리즘입니다. $proArr은 배열이 다음과 같다고 가정합니다(100,200,300,400). 첫 번째 숫자가 1,1000 내에 있는지 여부를 검사하는 것으로 시작됩니다. 그렇지 않다면 확률 공간, 즉 k에서 방금 나온 숫자의 확률 공간을 뺀 값이 이 경우에는 마이너스 100이 되는데, 이는 두 번째 숫자가 1에 속한다는 뜻이고, 900 범위 내에서 선별됩니다. 이런 식으로 끝까지 요구 사항을 충족하는 숫자는 항상 존재합니다. 이는 상자 안의 무언가를 만지는 것과 같습니다. 첫 번째 것도 없고, 두 번째도 없고, 세 번째도 없으면 마지막 것도 있어야 합니다. 이 알고리즘은 간단하고 매우 효율적입니다. 중요한 점은 이 알고리즘이 이전 프로젝트, 특히 대용량 데이터가 있는 프로젝트에 적용되었다는 것입니다.

다음으로 PHP를 통해 상을 구성합니다.

$prize_arr = array( 
  '0' => array('id'=>1,'prize'=>'平板电脑','v'=>1), 
  '1' => array('id'=>2,'prize'=>'数码相机','v'=>5), 
  '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10), 
  '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12), 
  '4' => array('id'=>5,'prize'=>'10Q币','v'=>22), 
  '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50), 
); 

이 2차원 배열은 이 복권의 모든 경품 정보를 기록합니다. 여기서 id는 당첨 수준을 나타내고, Prize는 경품을 나타내며, v는 당첨 확률을 나타냅니다. v는 정수여야 합니다. 해당 보상의 v를 0으로 설정할 수 있습니다. 이는 보상 획득 확률이 0임을 의미합니다. 배열(기본)에 있는 v의 합은 더 커집니다. 정확한 확률을 반영할 수 있습니다. 이 예에서 v의 합이 100이면 태블릿의 당첨 확률은 1%입니다. v의 합이 10,000이면 당첨 확률은 1/10000입니다.

프런트 엔드 페이지가 요청될 때마다 PHP는 보상 설정 배열을 반복하고 확률 계산 함수 get_rand를 통해 추첨된 보상 ID를 얻습니다. 당첨된 상금은 $res['yes'] 배열에 저장하고, 나머지 당첨되지 않은 정보는 $res['no'] 배열에 저장하고 마지막으로 json 번호 데이터를 프런트엔드 페이지에 출력합니다.

 foreach ($prize_arr as $key => $val) { 
   $arr[$val['id']] = $val['v']; 
 } 
 
 $rid = get_rand($arr); //根据概率获取奖项id 
 
 $res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项 
 unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项 
 shuffle($prize_arr); //打乱数组顺序 
 for($i=0;$i<count($prize_arr);$i++){ 
   $pr[] = $prize_arr[$i]['prize']; 
 } 
 $res['no'] = $pr; 
 echo json_encode($res);

첨부한 것도 네티즌의 구현 방법입니다

/**
  * 抽奖
  * @param int $total
  */
  function getReward($total=1000)
  {
  $win1 = floor((0.12*$total)/100);
  $win2 = floor((3*$total)/100);
  $win3 = floor((12*$total)/100);
  $other = $total-$win1-$win2-$win3;
  $return = array();
  for ($i=0;$i<$win1;$i++)
  {
  $return[] = 1;
  }
  for ($j=0;$j<$win2;$j++)
  {
  $return[] = 2;
  }
  for ($m=0;$m<$win3;$m++)
  {
  $return[] = 3;
  }
  for ($n=0;$n<$other;$n++)
  {
  $return[] = '谢谢惠顾';
  }
  shuffle($return);
  return $return[array_rand($return)];
  }
  $data = getReward();
  echo $data;
  &#63;>

위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.