1

真の乱数があり、mt_randを使用する前にmt_srandを使用してmt_randに真の乱数をシードした場合、これはmt_randの結果も疑似乱数ではなく真にランダムになることを意味しますか?

言い換えれば、以下のコードは、与えられた最小値と最大値の間に真にランダムな整数を生成しますか?

function RandomInteger($min, $max)
{
    $trueRandomNumber = GetTrueRandomNumber();

    mt_srand($trueRandomNumber);
    return mt_rand($min, $max);
}

次に、mt_srandのシードに使用される真の乱数は32個の整数である必要がありますか?

4

2 に答える 2

1

コードを見ると、GetTrueRandomNumber()から何らかの値を取得していると思いますが(コードがありません)、その数値を特定の値の範囲に収めたいと考えています。つまり、特定の範囲の数値を生成するメソッドがあるため、その出力を取得してmt_rand()に入力しています。

あなたの質問に対する直接の答えではありませんが、より良い解決策は、最初に必要な値の範囲を把握することです(つまり、入力$ minが0で、$maxが$max-$ minであるかのように)。次に、その範囲の値を取得するために必要な最大ビット数を計算します。次に、GetTrueRandomNumber()の出力からそのビット数を抽出します。値が範囲内にある場合は、数値+元の$min値を返します。値が範囲内にない場合は、より多くのデータを取得します。重要なのは、目的の範囲に収まるまでビットを破棄することです。

このためのサンプルソースコードが必要な場合は、次を試してください。

http://barebonescms.com/documentation/csprng/

似たようなものをまとめることができるはずです。このような場合にmt_rand()を使用することには注意が必要ですが、この非常に特殊なインスタンスでは問題ない可能性があります。それはあなたがそれを何のために使うことを計画しているかによります。また、メルセンヌツイスターの最初の数字が実際にどれだけうまく分布しているかにも大きく依存します。私は誰もそれについて何の仕事もしていないと思います。MTは、一度だけシードすることを目的としています。つまり、MTを繰り返しシードするための分布パターンを知っている人です。また、他のコードがmt_rand()を使用している場合、後のmt_rand()呼び出しによって生成される可能性のある後の値に基づいて、関数の状態が公開されるリスクがあります。

于 2012-08-05T15:24:01.023 に答える
1

いいえ。メルセンヌツイスター常に疑似ランダムです。シードは、シーケンスのどこから開始するかを決定するだけです。

于 2012-08-04T17:07:26.283 に答える