有三个数:1,2,3如果控制出现1的概率为2%,2的概率为20%,3的概率为78%

解决方案 »

  1.   

    $num=rand(0,100);
    if($num>0 and $num<2){return 1
    }elseif($num>20 and $num<78){return 2}else
    if($num>78){return 3}
      

  2.   

    借楼问一句,php的rand随机出来是均匀分布的么?
      

  3.   

    #1的不错,不过应该是rand(1,100)吧
      

  4.   

    给你一个phpchina论坛上的例子吧:<?php/**+------------------------------------------------------------------------------* 根据概率进行字母抽奖程序-程序说明+------------------------------------------------------------------------------* @author   horseluke http://www.phpchina.com/bbs/thread-104235-1-1.html* @version  0.0.1 Build 20090210-2215 BUG FIX1* @abstract 该程序主要演示随机抽取1——100中的任意一个整数,并且依据设置的概率得出其对应的字母号码。+------------------------------------------------------------------------------*//**+------------------------------------------------------------------------------* 根据概率进行字母抽奖程序-程序设置区。设置方法:        $a['幸运字母']=整数概率(取值应在1——100之内);* 可添加多个"$a['幸运字母']=整数概率",但要注意所有字母的概率总数为100。程序会自动检查。+------------------------------------------------------------------------------*/$a['A']=10;$a['B']=20;$a['C']=30;$a['D']=40;/**+------------------------------------------------------------------------------* 根据概率进行字母抽奖程序-程序运行区。请勿修改!+------------------------------------------------------------------------------*/$b_keynum=1;$b[0]=0;$a_key[0]='start';$total_probability=0;$total_probability_old=0;//以下代码主要用于对1——100进行分段、提取抽奖字母并与特定分段相关联,然后显示出来。foreach ($a as $key => $value){    if ($total_probability==0){            $total_probability_old=1;        }else{            $total_probability_old=$total_probability+1;        }        $total_probability = $total_probability + $value;        //进行各分段的概率相加    $b[]=$total_probability;        //该分段结束时候的数值        $a_key[]=$key;                  //该分段所对应的字母        $b_keynum++;                    //分段数        echo '幸运号码处在['.$total_probability_old.','.$total_probability.']这个区间的,幸运字母是:'.$key.'。<br />';}if($total_probability <> 100){          //检验总概率是否确实为100%。原理上来说用array_sum($a)也可以,但是前面都计算了$total_probability,所以......    echo '概率相加非100%,无法运行。程序即将退出......';        exit;}echo '<br /><br />-----下面进入抽奖时间------<br />';$luckynum=mt_rand(1,100);             //注意,不是(0,100)这样就会变成1/101概率。echo '你抽到的幸运号码是:'.$luckynum.'。';//分段循环比较。for ($k=0;$k<$b_keynum;$k++){    $ki=$k+1;    if ( (($luckynum - $b[$k] >= 0 ) &&($luckynum - $b[$ki] <0)) || ($luckynum == $b[$ki]) ){                        echo '因此,你抽到的幸运字母是:'.$a_key[$ki];                        exit;        }}?>
      

  5.   

    当然有规律了,不管是伪随机(PHP的rand应该是属于这种)还是随机,都是有分布规律的。
    多数伪随机都是出均匀分布的,其他分布都是要靠自己转的。