8:设随机抽到A的概率为0.1,B的概率为0.2,C的概率为0.3,D的概率为0.4,现在求按此概率随机抽出一个字母的算法
- <?php
- /*
- *8:设随机抽到A的概率为0.1,B的概率为0.2,C的概率为0.3,D的概率为0.4,现在求按此概率随机抽出一个字母的算法,
- *系统环境:windows/linux
- *编译环境:php4/php5
- *输入参数:存放在in.txt,多个参数时空格分隔
- 参数1是一个数字,表示测试循环次数
- 输出:out.txt
- */
- //输出结果
- //output(getRandomLetter(),true);
- $params=getParams(1);
- $argv0=trim($params[0]);
- if(!is_numeric($argv0))
- {
- error_msg("params 1 must be a numbers");
- }
- //测试几率
- $test=array();
- for($i=0;$i< $argv0;$i++)
- {
- $letter=getRandomLetter();
- if(!isset($test[$letter]))
- {
- $test[$letter]=0;
- }
- $test[$letter]++;
- }
- output("",true);
- foreach($test as $k => $v)
- {
- output("get $k times:$v");
- }
- error_msg("execute success");
- function getRandomLetter()
- {
- //随机数基数
- $MaxRand=10000;
- $percentA=0.1*$MaxRand; //获得A的几率1~$percentA; 1-1000
- $percentB=$percentA+0.2*$MaxRand; //获得A的几率$percentA+1~$percentB 1000~3000
- $percentC=$percentB+0.3*$MaxRand; //获得A的几率$percentB+1~$percentC 3000~6000
- $percentD=$percentC+0.4*$MaxRand; //获得A的几率$percentC+1~$percentD 6000~10000
- $r=rand(1, $MaxRand);
- if($r >= 1 && $r <= $percentA)
- {
- return "A";
- }
- if($r >= $percentA+1 && $r <= $percentB)
- {
- return "B";
- }
- if($r >= $percentB+1 && $r <= $percentC)
- {
- return "C";
- }
- if($r >= $percentC+1 && $r <= $percentD)
- {
- return "D";
- }
- return "";
- }
- /*
- 从in.txt里读取参数
- */
- function getParams($paramNum)
- {
- $in=file_get_contents("in.txt");
- if($in===FALSE){
- error_msg("cannot read in.txt,please check in.txt exists\n");
- }
- $in=preg_replace("/(\s+)/i", " ", $in);
- //多个参数时,按照空格分隔
- $parms=split(" ",trim($in));
- if($parms===FALSE)
- {
- error_msg("cannot get param from in.txt\n");
- }
- if(count($parms) < $paramNum)
- {
- error_msg("it needs $paramNum params\n");
- }
- return $parms;
- }
- /*
- 把结果输出到输出文件里
- 当isClean=true时清空out.txt
- */
- function output($msg,$isClean=false)
- {
- if($isClean)
- {
- $handle = fopen('out.txt', 'w');
- fclose($handle);
- }
- error_log($msg."\n", 3, "out.txt");
- }
- /*
- 输入错误信息
- 如果$is_exit表示输入信息后退出
- */
- function error_msg($msg,$is_exit=true)
- {
- if($is_exit)
- die($msg."\n");
- else
- echo $msg."\n";
- }
- ?>