0

繰り返しのない 4 つの複数の乱数が必要です。だから私はそれのために配列を取った。私が間違っていたところを手伝ってもらえますか?ランダムな順序で 24 の質問があります。ページごとに 4 つの質問が必要です。このために、配列「$questions」を取得し、最初に 25 を挿入しました。次に、配列にない乱数を取得したときはいつでも、その特定のインデックスを乱数に置き換えています。私はどこで間違ったのですか?

<?php
$questions = array(0);
for ($i = 0; $i < 24 ; $i++) {
$questions[$i]= ",";
}

$a="1";
$b="2";
$c="3";
$d="4";
//$a=rand(0, 23);
while(!in_array($a=rand(0, 23), $questions)) {
    $replacements = array($a => $a);
    $questions = array_replace($questions, $replacements);
    $max = sizeof($questions);
    if ($max==4) {
        break;
    }
    echo "<br>a=".$a."<br>";
    for ($i = 0; $i < 24 ; $i++) {
        echo $questions[$i];
    }
}
//echo "a=".$a."b=".$b."c=".$c."d=".$d;
?>
4

2 に答える 2

5

完全な配列/セットを一度ランダム化してから、それをチャンクに分割し、それらのチャンクを保存することをお勧めします (例: $_SESSION)。

<?php
$questions = data(); // get data
shuffle($questions); // shuffle data
$questions = array_chunk($questions, 4); // split into chunks of four
// session_start();
// $_SESSION['questions'] = $questions;
// on subsequent requests/scripts do not re-create $questions but retrieve it from _SESSION

// print all sets
foreach($questions as $page=>$set) {
    printf("questions on page #%d: %s\n", $page, join(', ', $set));
}

// print one specific set
$page = 2;
$set = $questions[$page];
printf("\n---\nquestions on page #%d: %s\r\n", $page, join(', ', $set));


// boilerplate function: returns example data
function data() {
    return array_map(function($e) { return sprintf('question #%02d',$e); }, range(1,24));
}
于 2013-03-10T10:42:06.213 に答える
3

次のようなことができます。

<?php

$archive = array();
$span = 23;
$amount = 4;
$i = 0;
while (true) {
    $number = rand(0, $span);             // generate random number
    if (in_array($number, $archive)) {    // start over if already taken
        continue;
    } else {
        $i++;
        $archive[] = $number;             // add to history
    }
    /*
      do magic with $number
    */
    if ($i == $amount) break;             // opt out at 4 questions asked
}
于 2013-03-10T10:40:29.313 に答える