PHPプログラミングでは、 rand()およびgetRandmax()関数は、乱数を生成するために使用される一般的なツールです。ただし、多くの開発者にとって、質問があるかもしれません。なぜ最大値がgetRandmax()とrand()によって返されることがありますか?
この問題をよりよく理解するには、これら2つの機能がどのように機能するかとその関係を詳細に調べる必要があります。
rand()は、擬似ランダム数を生成するために使用されるPHPの関数です。 0とgetRandmax()の間の整数値を返します。デフォルトでは、 rand()によって返される乱数は0からgetRandmax()になりますが、以下に示すように、2つのパラメーターを渡すことでこの範囲を変更できます。
<span><span><span class="hljs-variable">$random_number</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rand</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">100</span></span><span>); </span><span><span class="hljs-comment">// 生成する 1 到着 100 間の乱数</span></span><span>
</span></span>
getRandMax()関数は、 RAND()関数が生成できる最大整数値を返すために使用されます。簡単に言えば、 RAND()戻り値の上限を教えてくれます。この値のサイズは固定されていませんが、PHPの実装とシステムプラットフォームの乱数生成アルゴリズムによって決定されます。
<span><span><span class="hljs-variable">$max_rand_value</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getrandmax</span></span><span>(); </span><span><span class="hljs-comment">// 戻る rand() 関数の最大値</span></span><span>
</span></span>
まず、 getRandmax()によって返される最大値は、プラットフォームとPHPの乱数生成の実装に関連しており、必ずしも固定定数ではないことは明らかです。 rand()関数は、この上限に基づいて乱数を生成するため、理論的にはrand()によって返される値はgetRandmax()の最大値を超えてはなりません。
ただし、実際には、 RAND()によって返される最大値は、一部のプラットフォームまたは一部のPHP構成でgetRandMax()の上限に達していない場合があります。これは通常、次の理由によるものです。
異なるプラットフォーム間の異なる実装の違い<br> rand()およびgetRandmax()の実装は、オペレーティングシステムまたはハードウェアアーキテクチャ間で異なる場合があります。たとえば、一部のプラットフォームでは、異なる擬似ランダム数ジェネレーター(PRNG)を使用しており、これらのジェネレーターの最大値は一貫していません。したがって、 getRandmax()は理論的最大値を返しますが、実際に生成された乱数の範囲内で異なる実装のためにこの値に到達できない場合があります。
PHP内部実装
PHPは、異なるバージョンでRAND()関数の実装を調整することができます。 PHPの一部のバージョンでは、 RAND()は異なるアルゴリズムを使用して乱数を生成する場合があり、 getRandMax()によって返される最大値とRAND()によって返される最大値になります。これは通常、アルゴリズムの設計と最適化に関連しています。
使用された乱数アルゴリズム
デフォルトでPHPで使用される乱数生成アルゴリズムは、場合によっては返される最大値を制限する場合があります。たとえば、線形合同ジェネレーター(LCG)アルゴリズムを使用している場合、その期間と生成された乱数の範囲は、 getRandmax()のすべての可能な値をカバーしない場合があります。 Mersenne Twisterなどのより高度な乱数ジェネレーターは、通常、より広い範囲で高品質の乱数を提供します。
Rand()によって返される最大値がgetRandmax()と一致していることを確認する場合は、次の方法を使用できます。
rand()の代わりにmt_rand()を使用します
MT_RAND()は、Mersenne Twisterアルゴリズムを使用します。これは通常、より広い範囲の乱数を生成し、より均一であるため、 GetRandMax()の最大値をよりよく一致させます。
<span><span><span class="hljs-variable">$random_number</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>(); </span><span><span class="hljs-comment">// 使用 mt_rand() 乱数を取得します</span></span><span>
</span></span>
手動制限範囲<br> rand()を使用する必要があり、その値がgetRandmax()を超えないことを確認する必要がある場合、乱数を手動で範囲することができます。 min()およびmax()関数を使用して、戻り値が最大制限を超えないことを確認できます。
<span><span><span class="hljs-variable">$random_number</span></span><span> = </span><span><span class="hljs-title function_ invoke__">min</span></span><span>(</span><span><span class="hljs-title function_ invoke__">rand</span></span><span>(), </span><span><span class="hljs-title function_ invoke__">getrandmax</span></span><span>()); </span><span><span class="hljs-comment">// 最大値を超えないようにしてください</span></span><span>
</span></span>
getRandmax()およびrand()関数によって返される最大値は、主にPHP実装、プラットフォームの違い、使用される乱数アルゴリズムなどの要因により異なる場合があります。通常、それらは同じ上限を持っていますが、特に異なるオペレーティングシステムやハードウェアアーキテクチャでは、実際の使用で違いが発生する場合があります。
高品質の乱数ジェネレーターが必要な場合、 MT_RAND()は、Mersenne Twisterアルゴリズムに基づいているため、より良い選択です。