【问题标题】:PHP: Random numbers, no duplicate, no previous and following numberPHP:随机数,无重复,无前后数
【发布时间】:2013-08-29 09:48:20
【问题描述】:

下面的代码在 15 个中随机生成 3 个不重复的数字。

function num($min, $max, $count){
    $count = abs((int)$count);
    if($min > $max){
        list($min, $max) = array($max, $min);
    }
    $u = abs($max - $min);
    if($count > $u)$count = $u;
    $numresult = range($min, $max);
    shuffle($numresult);
    return array_slice($numresult, 0, $count);
}
foreach(num(1, 15, 3) as $rnum){
    echo $rnum, ' ';
}

当随机选择发生时,有没有办法同时排除前一个和下一个数字?例如:如果第一个选择的号码是 7,那么接下来的两个选择应该排除 6、7 和 8。目前仅排除 7 个。

【问题讨论】:

    标签: php random numbers


    【解决方案1】:

    你将不得不应用更多的聪明:

    function getNumbers($min=1,$max=10,$count=1,$margin=0) {
        $range = range(0,$max-$min);
        $return = array();
        for( $i=0; $i<$count; $i++) {
            if( !$range) {
                trigger_error("Not enough numbers to pick from!",E_USER_WARNING);
                return $return;
            }
            $next = rand(0,count($range)-1);
            $return[] = $range[$next]+$min;
            array_splice($range,max(0,$next-$margin),$margin*2+1);
        }
        return $return;
    }
    

    打电话:

    echo implode(", ",getNumbers(1,15,3,1));
    

    【讨论】:

    • 好吧,这太棒了!它开箱即用。非常感谢!
    • 作为一般规则,为确保它有效,您的论点应为$max-$min &gt; ($margin*2+1)*$count。这将确保,无论结果如何,它都能够每次都实际给您一个结果。在这种特殊情况下,14 &gt; 9 所以你很好。
    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2015-06-22
    • 2021-06-24
    相关资源
    最近更新 更多