2

rand 関数に問題があり、ウェブサイトをリロードするたびに、多くの場合、同じ数のレピットが表示されます。例のスクリプトを続行します。

for($i=0;$i<3;$i++)
{
$a=rand(0,2);
echo $a;
}

多くの場合、このスクリプトの結果はこれと正しい、(1,4,5)、またはこの問題を伴う他の場合 (1,2,2) または (2,3,2) (乱数を繰り返す)

多くの場合、1 つの数字を繰り返すと、この結果は 1 つの写真または 1 つのビデオを繰り返し、すべての異なる結果は表示されません

ありがとうございます。それでは、お元気で

4

2 に答える 2

2

あなたの場合、0 から 6 までの数字を含む配列を準備し、それをシャッフルします。

$a = range(0, 6);
shuffle($a);
foreach ($a as $x) { echo $x; }

もう 1 つのオプションは、既に生成された値のリストを保存し、拒否サンプリングを使用することです。つまり、リストにない値が見つかるまで再試行します。どちらの方法を使用するか (事前に作成されたリストをシャッフルして返すか、そのサブリストを返すか、または拒否サンプリングのいずれか) は、ほとんどの場合、許可される数値の範囲と返すアイテムの数によって異なります。ただし、あなたの場合のように、(0, 6) から 7 つの一意の数字を生成する必要がある場合は、シャッフルがほとんどの場合正しい選択です。一方、(0, 10 20 ) から 3 つの一意の数値を生成する必要がある場合、トレードオフは大きく異なります。

于 2013-07-29T09:11:08.320 に答える
0

もう 1 つの方法は、セッションの最後のランダム値を保存し、数値が等しい場合にループを再開することです。

for($i=0;$i<3;$i++)
{
    $a=rand(0,2);
    if(isset($_SESSION['lastRand']) && $a == $_SESSION['lastRand']) {
        $i = 0;
        continue;
    }
    $_SESSION['lastRand'] = $a;
    echo $a;
}
于 2013-07-29T09:27:59.517 に答える