php 按比例输出随机数怎么实现?

rcznh 2018-01-09 09:39:28
$sc = strval(rand("9","49"));
echo "$sc";

以上只能随机显示输出一个数,不能按比例输出,如何才能按以下比例输出?请高手给出代码,谢谢!

输出9-19(其中要去掉10这个数)占60%
输出21-29占25%
输出31-39占10%
输出41-49占5%

即每刷新一次输出一个数,每刷新100次,输出的比例能大概实现以上比例要求,谢谢!

...全文
1234 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
newpeng 2018-01-11
  • 打赏
  • 举报
回复
引用 楼主 rcznh 的回复:
$sc = strval(rand("9","49")); echo "$sc"; 以上只能随机显示输出一个数,不能按比例输出,如何才能按以下比例输出?请高手给出代码,谢谢! 输出9-19(其中要去掉10这个数)占60% 输出21-29占25% 输出31-39占10% 输出41-49占5% 即每刷新一次输出一个数,每刷新100次,输出的比例能大概实现以上比例要求,谢谢!
可以这样,首先获取1-100的随机数, 当结果在 1-60时,输出 9-19 的随机数 当结果在 61-85时,输出 21-29 的随机数 当结果在 86-95时,输出 31-39 的随机数 当结果在 96-100时,输出 41-49 的随机数 多简单的事。
shoplamp 2018-01-10
  • 打赏
  • 举报
回复
版主正解版主正解
xuzuning 2018-01-10
  • 打赏
  • 举报
回复
100个太少了,1000、10000个就可看到规律了。建议你补习一下概率知识 我在循环里输出,自然是循环终值多大,就有多少个
rcznh 2018-01-10
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:

(
    [21-29] => 22
    [9-19] => 66
    [31-39] => 5
    [41-49] => 7
)
好象不太准确,41-49要控制在5%之内的,但 [41-49] => 7,这样有7个呢,如何能更精准点? 还有每次输出只要一个值: echo "";
qq_34139573 2018-01-09
  • 打赏
  • 举报
回复
先随机出一个1-100的随机数, 如果是1~60之间取9~19的随机数,如取到10,再取一个9~19的随机数,直到不是10 如果是61~85之间取21~29的随机数 如果是86~95之间取31~39 如果96~100之间取41~49
xuzuning 2018-01-09
  • 打赏
  • 举报
回复
//概率分布
function Probability($ar) {
  $total = array_sum($ar);
  foreach($ar as $k=>$v) {
    $n = rand(1, $total);
    if($n <= $v) return $k;
    $total -= $v;
  }
  return $k;
}

$k = array(
  array(9,19),
  array(21,29),
  array(31,39),
  array(41,49),
);

$d = array(60,25,10,5);

for($i=0; $i<100; $i++) {
  $t = Probability($d);
  @$r[join('-',$k[$t])]++;
  do {
    $n = rand($k[$t][0] , $k[$t][1]);
  }while($t == 0 && $n == 10);
  echo " $n";
}
//ksort($r);
print_r($r); //验证算法的有效性
一个可能的结果

 26 23 23 14 17 13 9 16 23 9 17 34 14 9 19 13 14 16 48 31 16 17 24 9 13 9 13 13 28 28 17 13 19 14 13 18 49 21 9 18 16 46 25 39 22 15 25 27 37 19 18 22 16 17 9 11 16 19 24 14 13 11 17 16 18 12 17 19 23 28 18 17 13 19 29 26 15 14 18 11 44 22 19 13 9 19 9 23 33 43 14 9 17 43 18 18 29 25 15 45Array
(
    [21-29] => 22
    [9-19] => 66
    [31-39] => 5
    [41-49] => 7
)
超级大冲 2018-01-09
  • 打赏
  • 举报
回复
你把这些数做一个统计先
Just_cl 2018-01-09
  • 打赏
  • 举报
回复
生成9-19除开10的随机数60个,21-29的25个,31-39的10个,41-49的5个,然后这100个数扔到redis list,每次取数从列表中pop一个(然后lpush一个该数对应区间的随机数或不想lpush可以list为空后再重新生成列表)

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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