真实概率计算

概率计算,或许大家说rand()可以实现,没错,rand()是随机数,但是如何控制概率呢。。看看这里吧,有一般的方法也有新的方法,真实概率。
其实概率这个问题也困惑了我一些时间,但是发现,前些时间公司开始一个需要可控的概率计算功能。
问了一些朋友,都和我以前的做法一样,比如我们分配给:
A 30%
B 30%
C 40%
哪么,依照上面的表,rand(1,100)。
A 则是 1-30
B 则是 31-60
C 则是 61-100
将rand()出来的结果,分别按照上面的检测则输出获得得项。这个就是一般的分配法。
看看随机程度,但是整体上来看,很连贯,没有概率的感觉,不能保证真实性质。
哪么下面就来一种能够真实的做法吧。
首先,我们还是依照上面的,用循环按照连贯的方式分配给一个数组:
$arr[1] 至 $arr[30] = 'A'
$arr[31] 至 $arr[60] = 'B'
$arr[61] 至 $arr[100] = 'C'
这样你应该能够联想到顺序了吧,明晰的分了3个块。下面使用数组乱序排列。
shuffle()? 不不用这个,这个函数存在问题,就是会丢失数组元素,而不是打乱顺序。
那么怎么办呢,自然就用自己的函数咯,rand_array()。下面是函数结构。
<?php
function rand_array($arr) {
    $arr_size = sizeof($arr);
    $tmp_arr = array();
    for ($i = 0; $i < $arr_size; $i++) {
        mt_srand((double) microtime() * 1000000);
        $rd = mt_rand(0, $arr_size - 1);
        if ($tmp_arr[$rd] == \"\"){
			$tmp_arr[$rd]=$arr[$i];
		}
		else
		{
			$i=$i-1;
		}
	}
	return $tmp_arr;
}
?>


这样这么一个函数就可以让一个很明晰的概率数组打乱掉。实现真实的概率。
这样大家应该明白了吧。自己用吧~~~不懂的留言评论。
概率控制。。。嘛不就是,百分比是0....好不多说。。。实际用法以后会给出,今天晚了就到此....

这个算法效率比较低,如果做一般的概率的话可以选择简便的方法。。。

$setting = array(
// 黑色概率
0 => 0.99,
// 白色概率
1 => 0.01,
);
// Requires the GD Library
header("Content-type: image/png");
$im = imagecreatetruecolor(256, 256) or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
$start = microtime(true);
for ($y=0; $y<256; $y++) {
for ($x=0; $x<256; $x++) {
if (random($setting) === 1) {
imagesetpixel($im, $x, $y, $white);
}
}
}
$time = microtime(true) - $start;
header("X-Exec-Time: ".$time);
imagepng($im);
imagedestroy($im);

 @param array $input array('a'=>0.5,'b'=>0.2,'c'=>0.4)
 * @param int $pow 小数点位数
 * @return array key
 */
function random($input, $pow = 2) {
    $much = pow(10, $pow);
    $max  = array_sum($input) * $much;
    $rand = mt_rand(1, $max);
    $base = 0;
    foreach ($input as $k => $v) {
        $min = $base * $much + 1;
        $max = ($base + $v) * $much;
        if ($min <= $rand && $rand <= $max) {
            return $k;
        } else {
            $base += $v;
        }
    }
    return false;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值