質問
使用するだけでそれがわかります rand()
自分が何をしているのかを理解しており、サーバーにアクセスできる場合は、予測可能です。
私にはプロジェクトがあります 非常に 可能な限り予測不可能な乱数を選択するかどうかに依存します。そこで、他の組み込み関数またはユーザー関数のいずれかで、 より良い 乱数。
これを使ってちょっとしたテストをしてみました。
$i = 0;
while($i < 10000){
$rand = rand(0, 100);
if(!isset($array[$rand])){
$array[$rand] = 1;
} else {
$array[$rand]++;
}
sort($array);
$i++;
}
結果は均等に分布しており、各数値が生成される回数には奇妙なパターンがあることがわかりました。
解決
貧弱なランダム ソースを加算、乗算、または切り捨てると、貧弱なランダム結果が得られます。見る 乱数と乱数の概要 説明のために。
PHPのrand()関数については正しいです。の 2 番目の図を参照してください。 統計分析 印象的なイラストに。(最初の図は印象的ですが、これは Scott Adams によって描かれたものであり、rand() でプロットされたものではありません)。
1 つの解決策は、次のような真のランダム ジェネレーターを使用することです。 ランダム.org. 。もう 1 つは、Linux/BSD などを使用している場合です。使うことです /dev/ランダム. 。ランダム性がミッションクリティカルである場合は、 ハードウェアランダムジェネレーター.
他のヒント
ランダム.org HTTP 経由でアクセスできる API があります。
Random.orgは、大気ノイズを介してランダム性を生成する真の乱数サービスです。
私はランダムな印象があることに注意したいと思います。人々がよりランダムでない分布を選択するという実験が数多く行われてきました。心はランダム性を生み出したり推定したりすることがあまり得意ではないようです。
ランダム性に関する優れた記事が次の場所にあります。 フォーミラボ, 、別のものを含む 真のランダムジェネレーター. 。おそらく、両方のサイトからランダムなデータを取得して、一方がダウンしてももう一方は残っている可能性があります。
Fourmilab はまた、 テストプログラム ランダム性をチェックします。これを使用して、さまざまな myRand() プログラムをチェックできます。
最後のプログラムに関しては、10,000 個の値を生成した場合、10,000 個の中から最終的な値を選択しないのはなぜでしょうか。自分自身をサブセットに制限します。また、$min と $max が 10000 より大きい場合は機能しません。
いずれにしても、必要なランダム性はアプリケーションによって異なります。rand() はオンライン ゲームには問題ありませんが、暗号化には問題ありません (統計プログラムで徹底的にテストされていないものはいずれにしても暗号化には適していません)。あなたが裁判官になってください!
EPOCH 以降のミリ秒をランドのシードとして使用する、@KG のバリエーションですか?
乱数を取得する別の方法。概念的には UUID を取得するのと似ています。
PHP バージョン 5.3 以降
openssl_random_pseudo_bytes(...)
または、次のことを試すこともできます 図書館 RFC4122を使用
新しい PHP7 必要なことを正確に実行する関数があります。それは生成します 暗号的に安全な擬似乱数整数。
int random_int ( int $min , int $max )
公平な結果が重要である場合に使用するのに適した暗号化ランダム整数を生成します(つまりポーカーデッキをシャッフルする)。
PRNG と CSPRNG (およびそれらの違い) の詳細な説明と、元のアプローチが実際に悪いアイデアである理由については、私の記事を読んでください。 別の非常によく似た回答.