您的位置:首页 > 其它

随机概率问题

2011-07-20 23:04 316 查看
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";
}
?>


本文出自 “一方有” 博客,请务必保留此出处http://yifangyou.blog.51cto.com/900206/618827
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: