확률 뽑기에 대한 php 코드 구현
- ~20의 숫자중에서 랜덤으로 1개숫자를 뽑는데요,
1~5 는 2%확률로 나오고,
6~10은 3%확률로 나오고,
11~15는 5%,
16~20은 90%.
우선 1~100까지 숫자를 랜덤으로 뽑습니다.
그 숫자가
1~2
2~5
5~10
10~100
까지 범위로 구분해서
1~5
6~10
11~15
16~20
의 숫자로 매칭
이재 숫자들중 하나를 다시 랜덤으로 뽑으면 됩니다.
<?php
$l = 1000; // 반복 횟수
$p[4] = $p[3] = $p[2] = $p[1] = 0; // 범위 초기
for ($i=0;$i<$l;$i++)
{
$n = mt_rand($s=($e=($w=($r=mt_rand(1,100))<3 ?1:($r<6?2:($r<11?3:4)))*5)-4,$e);//★
$p[ceil($n/5)]++; // 범위 증가
}
echo '<xmp style="font-family:GulimChe;">';
for ($i=1;$i<5;$i++)
{
$s=($e=$i*5)-4;
printf("%02d ~ %02d : %02.2f %%\n",$s,$e,$p[$i]/$l);
}
echo '</xmp>';
?>
a 상품은 3 (다른것보다 3배로 잘나올 확률)
b 상품은 2 (다른 것보다 2배로 잘나올 확률)
a 상품은 1 (다른 보통것 확률)
d 상품은 1
e 상품은 3
f 상품은 2
g 상품은 1
h 상품은 2
이런 경우라고 하면은
모든것의 총합은 a~h 까지의 숫자의 합인 15에서
aaabbcdeeeffghh
여기에서 랜덤하게 뽑힌다고 생각하면 되니까
rand(1,15)에서 나온 숫자가 1~3이면 a , 4~5 b 이런 형태로 대응
근데 문제는 이게 1개가 아니라 여러갯수를 연달아 뽑는 확률임. 한번 뽑은건 다시 뽑을 수 없음.
뽑는 횟수를 x라고 하고
상품당 배율을 i라고 하면
x=1 일때
상품당 i번씩 배열에 담음
그리고 랜덤추첨
x=2일때 앞에 뽑은 상품을 제거한 배열에서
랜덤추첨
이런식으로 x=x일때까지 돌려주면
총 x개일때 확률별로 나오게 될것같음
$randbox = array();
$res = array(
array('a', 0),
array('b', 1),
array('c', 2),
array('d', 3),
array('e', 0),
array('f', 0),
array('g', 0),
array('h', 0),
array('i', 0),
array('j', 0),
array('k', 0),
array('l', 3),
array('m', 3)
);
//sum(as_extra) as sum , wr_id
for($i=0;$i<count($res);$i++){
if($res[$i]['1'] == 0) $randbox[] = $res[$i]['0'];
else {
for($k=0;$k<$res[$i]['1'];$k++) {
if($k==0 ) $u = $i;
$randbox[] = $res[$u]['0'];
}
}
}
print_r($randbox);
echo $randbox[rand(1,count($randbox))]
1회차 추첨.
배열생성만 함수로 만듬
function random_box($res){
for($i=0;$i<count($res);$i++){
if($res[$i]['1'] == 0) $randbox[] = $res[$i]['0'];
else {
for($k=0;$k<$res[$i]['1'];$k++) {
if($k==0 ) $u = $i;
$randbox[] = $res[$u]['0'];
}
}
}
return $randbox;
}