乱数生成の2つの選択肢のどちらがより良いランダム性を生み出すかを知っている人はいますか?
<?php
$array = array(1,2,3,4,5,6);
shuffle($array);
echo $array[0];
//// OR ////
echo rand(1,6);
?>
それとも、私が知らないさらに良いオプションがありますか?
乱数生成の2つの選択肢のどちらがより良いランダム性を生み出すかを知っている人はいますか?
<?php
$array = array(1,2,3,4,5,6);
shuffle($array);
echo $array[0];
//// OR ////
echo rand(1,6);
?>
それとも、私が知らないさらに良いオプションがありますか?
どちらも同じPRNGを使用するため、ランダム性は同じように良い/悪いです。明らかに、プレーンrand(1,6)
は単なる数学であり、数学と配列の両方ではないため、より高速です。array_rand()
それに加えて、配列からランダムな要素が必要な場合に使用します。
PHPにはメルセンヌツイスター(mt_rand()
)もあります。これは「優れている」が暗号化には適していません(おそらくあなたの場合は関係ありません)。
真のランダム性が必要な場合は、からの読み取りを検討できますが/dev/random
、使用可能なランダム性がない場合、その読み取りはブロックされる可能性があります。また、物理的な効果に基づいてさらに優れたランダム性を提供するハードウェアデバイスを使用することもできます。
ほとんどのシステムでは、乱数ジェネレーターにランダムな値をシードします。ほとんどのアプリケーションでは、現在の時刻の下位部分(秒やマイクロ秒など)を使用するのが非常に優れた戦略です。それがあなたのために働くかどうかは、アプリケーションに依存します。
Linuxシステムでは、プログラムは乱数ジェネレーターから数バイトを読み取ったり、乱数ジェネレーターをシードし/dev/random
たりすることもできます。/dev/urandom
これは、デバイスドライバーやその他の予測が難しい現象からのランダムなエントロピーの集中です。