ホームページ >バックエンド開発 >PHPチュートリアル >PHPの擬似乱数と真の乱数について詳しく解説

PHPの擬似乱数と真の乱数について詳しく解説

怪我咯
怪我咯オリジナル
2017-07-11 11:41:352289ブラウズ

この記事では、主に PHP における疑似乱数と真の乱数の詳細な説明を紹介します。この記事では、最初に真の乱数と疑似乱数の関連概念を説明し、mt_rand( を使用するよりも優れた疑似乱数を提供します)。 )関数 乱数のサンプルコードです。必要な友人はそれを参照できます

まず第一に、コンピューターは完全にランダムな乱数を生成するわけではなく、コンピューターは「疑似乱数」のみを生成できることを述べておく必要があります。数字」。実際、絶対乱数は理想的な乱数にすぎません。コンピュータがどのように発達しても、完全に乱数の列は生成されません。コンピューターは比較的ランダムな数、つまり擬似乱数しか生成できません。

擬似乱数は擬似乱数ではありません。ここでの「擬似」は規則的なことを意味します。つまり、コンピューターによって生成される擬似乱数はランダムであり、規則的でもあります。どのように理解すればよいでしょうか?生成された擬似乱数は、特定のルールに従う場合もあれば、どのルールにも従わない場合もあります。一部の疑似乱数は、特定のルールに従いません。例えば、「世界に同じ形の葉は二つとない」ということは、物事の性質、つまりランダム性を指しますが、どの木の葉も同じような形をしている、つまり物事の共通性を指します。 、規則性。この観点から見ると、コンピュータは疑似乱数しか生成できず、完全な乱数を生成することはできないという事実をおそらく受け入れるでしょう。

まず、真の乱数と擬似乱数の概念を理解しましょう。

真性乱数発生器: 英語: true Random Number Generator、略称: TRNG は、予測不可能な物理的方法によって生成される乱数です。

擬似乱数発生器: 英語: pseudo-randomnumbergenerators、略称: PRNG は、特定のアルゴリズムを使用してコンピュータによって生成されます。 2 つの方法で生成された乱数の

画像を比較します。

Random.org (大気ノイズを使用して乱数を生成し、大気ノイズは空中の雷雨によって生成されます) によって生成されたランダム ビットマップ:

Windows で PHP の rand() 関数によって生成されたランダム画像:

明らかに、後者の擬似乱数発生器によって生成された画像には、これらの明らかな縞模様があります。

この画像を生成するために PHP の rand ランダム関数を使用するコードは次のとおりです:


コードは次のとおりです:

//需要开启gd库
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512)
or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
for ($y=0; $y<512; $y++) {
for ($x=0; $x<512; $x++) {
if (rand(0,1) === 1) {
imagesetpixel($im, $x, $y, $white);
}
}
}
imagepng($im);
imagedestroy($im);

実際、すべての擬似乱数ジェネレーター (PRNG) がそれほど悪いわけではなく、たまたまそうなっているだけです。 Windowsの場合 以下のPHPのrand()関数はこんな感じです。同じコードを Linux でテストすると、結果の画像には明らかな縞模様が表示されません。 Windows では、rand() 関数の代わりに mt_rand() 関数を使用すると、効果が大幅に向上します。これは、mt_rand() がメルセンヌ ツイスター アルゴリズムを使用して乱数を生成するためです。 PHP のドキュメントには、「mt_rand() は、libc が提供する rand() よりも平均 4 倍の速さでランダムな値を生成できる」とも記載されています。

以下は、PHP を使用して mt_rand() 関数よりも優れた擬似乱数を生成するコード例です:


コードは次のとおりです:

<?php
// get 128 pseudorandom bits in a string of 16 bytes
$pr_bits = &#39;&#39;;
// Unix/Linux platform?
$fp = @fopen(&#39;/dev/urandom&#39;,&#39;rb&#39;);
if ($fp !== FALSE) {
$pr_bits .= @fread($fp,16);
@fclose($fp);
}
// MS-Windows platform?
if (@class_exists(&#39;COM&#39;)) {
try {
$CAPI_Util = new COM(&#39;CAPICOM.Utilities.1&#39;);
$pr_bits .= $CAPI_Util->GetRandom(16,0);
// if we ask for binary data PHP munges it, so we
// request base64 return value. We squeeze out the
// redundancy and useless ==CRLF by hashing...
if ($pr_bits) { $pr_bits = md5($pr_bits,TRUE); }
} catch (Exception $ex) {
// echo &#39;Exception: &#39; . $ex->getMessage();
}
}
if (strlen($pr_bits) < 16) {
// do something to warn system owner that
// pseudorandom generator is missing
}
?>

したがって、PHP が真の乱数を生成したい場合は、依然として必要があります。それをサポートするために外部要素を呼び出します。

以上がPHPの擬似乱数と真の乱数について詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。