6

クイズ作成サイトを運営しています。質問に対する回答をシャッフルされた順序でユーザーに表示したいと思います。

ランダムにシャッフルする場合は、回答がユーザーに提示された順序を保存しないようにしています。

後で(結果を表示するときに)同じようにシャッフルを繰り返すことができるように、予想どおりに回答をシャッフルしたいと思います。

回答のリストを特定の番号でシャッフルできると思いました(並べ替え内の番号を使用するか、ID番号で識別できる複数の種類の並べ替えを使用します。 これにより、シャッフルされた番号を簡単に保存できます。その番号を思い出して、同じ順序に再シャッフルします。

これが私がこれまでに持っているものの骨組みですが、答えをシャッフルされた順序で$shuffled_arrayに戻すロジックがありません。

<?php

function SortQuestions($answers, $sort_id)
{
    // Blank array for newly shuffled answer order
    $shuffled_answers = array();

    // Get the number of answers to sort
    $answer_count = count($questions);

    // Loop through each answer and put them into the array by the $sort_id
    foreach ($answers AS $answer_id => $answer)
    {
        // Logic here for sorting answers, by the $sort_id

        // Putting the result in to $shuffled_answers
    }

    // Return the shuffled answers
    return $shuffled_answers;
}


// Define an array of answers and their ID numbers as the key
$answers = array("1" => "A1", "2" => "A2", "3" => "A3", "4" => "A4", "5" => "A5");

// Do the sort by the number 5
SortQuestions($answers, 5);

?>

関数に渡された数値で回答をシャッフルするために使用できる手法はありますか?

4

3 に答える 3

3

PHP のシャッフル関数はsrandで指定されたランダム シードを使用するため、これに特定のランダム シードを設定できます。

また、シャッフル メソッドは配列キーを変更しますが、これはおそらく最良の結果ではないため、別のシャッフル関数を使用できます。

function shuffle_assoc(&$array, $random_seed) {
    srand($random_seed);

    $keys = array_keys($array);

    shuffle($keys);

    foreach($keys as $key) {
        $new[$key] = $array[$key];
    }

    $array = $new;

    return true;
}

この関数は元のキーを保持しますが、順序が異なります。

于 2013-01-17T09:50:23.913 に答える
2

配列を係数で回転させることができます。

$factor = 5;
$numbers = array(1,2,3,4);
for ( $i = 0; $i < $factor; $i++ ) {
    array_push($numbers, array_shift($numbers));
}
print_r($numbers);

因子はランダム化することができ、関数は逆方向にローテーションすることで配列を元の位置に戻すことができます。

于 2013-01-17T09:51:07.113 に答える
0

これは考えられる方法の 1 つです。

$result = SortQuestions($answers, 30);
print_r($result);


function SortQuestions($answers, $num)
{
$answers = range(1, $num);
shuffle($answers);
return $answers;
}
于 2013-01-17T09:50:24.820 に答える