代码如下:
<?php
/**
*
抽奖
*
@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
?>
问题衫腔有点模糊,我先暂时把“保留两位小数”理解成“[输出的随机数]保留两位小数”,而非其他因素保留多少小数。
又把“1-10”,理解成包括1和10在内其两数之间的小数,
把10-50,理解成10.01到50.00之间的数,不包括10.00。以此类推。
<?phpfunction genRandom(){
$p=rand(1,100)
if($p<=60) $r=rand(100,1000)
elseif($p>60 and $p<=85) $r=rand(1001,5000)
elseif($p>85 and $p<=95) $r=rand(5001,10000)
else $r=rand(10001, 20000)
return $r/100
}
$a=array()
$total=50000
for($i=0$i<$total$i++){
$c=genRandom()
if($c>=1 and $c<=10) $p=0
elseif($c>10 and $c<=50) $p=1
elseif($c>50 and $c<=100) $p=2
elseif($c>100 and $c<=200) $p=3
else $p=4
if(!array_key_exists($p, $a)) $a[$p]=1
else $a[$p]++
}
if(!array_key_exists(4, $a)) $a[4]=0
echo "总样本数".$total.'<br/>'
echo "1-10样本数".$a[0].', 或唯衫占'山竖.($a[0]/$total*100).'%<br/>'
echo ">10-50样本数".$a[1].', 占'.($a[1]/$total*100).'%<br/>'
echo ">50-100样本数".$a[2].', 占'.($a[2]/$total*100).'%<br/>'
echo ">100-200样本数".$a[3].', 占'.($a[3]/$total*100).'%<br/>'
echo "其他样本数".$a[4].', 占'.($a[4]/$total*100).'%<br/>' 总样本数50000
1-10样本数30052, 占60.104%
>10-50样本数12404, 占24.808%
>50-100样本数4993, 占9.986%
>100-200样本数2551, 占5.102%
其他样本数0, 占0%
解决思路如下:1)以数字区段来对应中奖情况例如有一、二、三等奖,各自的中奖概率分别为10%、20%、30%那么有如下划历灶扰分:1-10,一等奖;11-30,二等奖;31-60,辩陪三等奖,60以上,未中奖
2)产生一个1~100之间的随机数,看随机数属于哪个奖项区域,以确定中奖肢旦情况
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)