概率不等的随机数生成的一点思路

题目:产生0-9中的随机数,要求0到9出现的概率依次递减,
一般思路,把10个0,9个1,8个2.....2个8,1个9放到数组中,然后随机生成数组下标,按下标取出数字.
二般思路:生成两个0-9的随机数,取小的那个,这个思路(手链魔咒提出)说实际的不知道是什么原理,但是实验证明,确实能达到效果.
验证方法:
程序代码
<?php
function fun(){
$num = rand(0,9); //10以内的数字平均分配
$num2 = rand(0,9);
($num2<=$num) ? $return.=$num2 : $return.=$num;
return $return;
}
function totalStr($haystack, $needle,$i = 0){//检验字串中某个字符出现的次数
while(strpos($haystack,$needle) !== false) {
$haystack = substr($haystack, (strpos($haystack,$needle) + 1));
$i++;
}
return $i;
}
for ($i=0;$i<=1000;$i++){
$str .= fun();
}
for ($i=0;$i<=9;$i++){
echo totalStr($str,"$i")."\n"; //0-9出现的次数
}
?>

写下这片后不久,手链魔咒有优化了算法
具体见下:
程序代码
function getRand($min,$max) {
$num=rand($min,$max);
return rand($min,$num);
}

还有另一位高人写的一个函数,数学思想比较强,不太好理解
程序代码
function getRandomByFactor($max,$factor=2){
$c = rand(0,pow($max,$factor));
return $max - ceil(pow($c,1/$factor));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值