概率计算,或许大家说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()。下面是函数结构。
这样这么一个函数就可以让一个很明晰的概率数组打乱掉。实现真实的概率。
这样大家应该明白了吧。自己用吧~~~不懂的留言评论。
概率控制。。。嘛不就是,百分比是0....好不多说。。。实际用法以后会给出,今天晚了就到此....
其实概率这个问题也困惑了我一些时间,但是发现,前些时间公司开始一个需要可控的概率计算功能。
问了一些朋友,都和我以前的做法一样,比如我们分配给:
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;
}