0

以下のコードは、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 の場合、次の 2 つのピックでは 6、7、および 8 を除外する必要があります。現在、除外されているのは 7 つだけです。

4

1 に答える 1

3

もう少し賢く適用する必要があります。

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));
于 2013-08-29T09:53:41.583 に答える