如何按百分比控制概率

w78z007 2009-09-24 07:02:28
有三个数:1,2,3

如果控制出现1的概率为2%,2的概率为20%,3的概率为78%
...全文
596 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlexanderSun 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 abest 的回复:]
引用 2 楼 bookmoth 的回复:
借楼问一句,php的rand随机出来是均匀分布的么?


既然是随机就是没有规律的,不是均匀分布。
[/Quote]当然有规律了,不管是伪随机(PHP的rand应该是属于这种)还是随机,都是有分布规律的。
多数伪随机都是出均匀分布的,其他分布都是要靠自己转的。
应该网 2009-09-25
  • 打赏
  • 举报
回复
给你一个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;

}

}





?>
foolbirdflyfirst 2009-09-25
  • 打赏
  • 举报
回复
#1的不错,不过应该是rand(1,100)吧
应该网 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bookmoth 的回复:]
借楼问一句,php的rand随机出来是均匀分布的么?
[/Quote]

既然是随机就是没有规律的,不是均匀分布。
bookmoth 2009-09-24
  • 打赏
  • 举报
回复
借楼问一句,php的rand随机出来是均匀分布的么?
JatAwn 2009-09-24
  • 打赏
  • 举报
回复
$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}

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧