0

人々が自分のサイトにアクセスするために使用する疑似ランダム コードを生成する必要があります。これを可能にするコードをいくつか書きましたが、(mt_rand を反復可能にするために) シードとして整数ではなく文字配列を使用していることに気付きませんでした。私のデモコードはここにあります:

$seedVal = array(6565866669, 6565866670, 6565866671);


foreach ($seedVal as $seed) {
    mt_srand($seed);
    $rnd = '';
    for ($i = 0; $i < 11; $i++) { // Loop over the string length
        $tmp = mt_rand(0, 10);
        $rnd .= $tmp;
    }

    echo "Seed = $seed, RandNum = $rnd </br>";
}

echo "</br>Now with character seeds</br>";

$seedVal = array('6565866669', '6565866670', '6565866671');

foreach ($seedVal as $seed) {
    mt_srand($seed);
    $rnd = '';
    for ($i = 0; $i < 11; $i++) { // Loop over the string length
        $tmp = mt_rand(0, 10);
        $rnd .= $tmp;
    }

    echo "Seed = $seed, RandNum = $rnd </br>";
}

return;

1and1 の結果は次のとおりです。

Seed = 6565866669, RandNum = 425453109319 
Seed = 6565866670, RandNum = 39388593858 
Seed = 6565866671, RandNum = 891273965110 

Now with character seeds
Seed = 6565866669, RandNum = 97138956767 
Seed = 6565866670, RandNum = 97138956767 
Seed = 6565866671, RandNum = 97138956767 

しかし、それ以外の場所 (ローカルホスト、他のサーバーなど) の結果は次のとおりです。

Seed = 6565866669, RandNum = 425453109319
Seed = 6565866670, RandNum = 39388593858
Seed = 6565866671, RandNum = 891273965110

Now with character seeds
Seed = 6565866669, RandNum = 425453109319
Seed = 6565866670, RandNum = 39388593858
Seed = 6565866671, RandNum = 891273965110 

問題は、現在のサーバー (1and1) でシステムが正常に動作することです (予測できない文字入力を使用)。しかし、私は新しいサーバーに移行しています。もちろん、コードは常に最初のセットのように見えます。つまり、乱数の 2 番目のセット (文字配列がシードされている) を生成する方法がわかりません。

誰でもこれを行う方法を教えてもらえますか?

私が欲しい:

mt_srand('6565866669');
echo mt_rand(0, 10);

戻る

97138956767

悪戦苦闘。ありがとうございました!!

4

1 に答える 1

4

(そこからのクレジットが問題を特定しました:32ビットと64ビットのサーバーがあります。彼が投稿した場合は彼の答えを受け入れてください)

これはあなたの問題です:

  1. mt_srand() は整数パラメータを取ります
  2. パラメータに必要な場合、PHP は (便利なことに) 文字列を整数としてキャストしようとします。
  3. 64 ビット システムでの最大整数は 4.数ガジリオンです。したがって、文字列は整数に変換されますが、32 ビット システムでは、最大整数は 21 億であるため、文字列は許容範囲内の別の整数に変換されます ( 21 億に達し、-21 億にラップしてカウントアップし、繰り返します)。

big_ints を処理するための解決策は、GMP または BCMath ライブラリを使用することですが、この場合、mt_srand() が整数を取るため、これらは機能しません。したがって、-21 億から +21 億の間の数値に制限されるか、64 ビットをインストールします。 Web サーバー上の OS/Apache/PHP。

于 2012-09-14T02:05:53.320 に答える