In der PHP -Programmierung sind die Funktionen von Rand () und getRandmax () gemeinsame Tools, mit denen Zufallszahlen generiert werden. Für viele Entwickler kann es jedoch eine Frage geben: Warum werden die maximalen Werte von getRandmax () und Rand () manchmal nicht konsistent zurückgegeben?
Um dieses Problem besser zu verstehen, müssen wir eingehend untersuchen, wie diese beiden Funktionen funktionieren und ihre Beziehung.
Rand () ist eine Funktion in PHP, mit der Pseudo-Random-Zahlen generiert werden. Es gibt einen Ganzzahlwert zwischen 0 und getrandmax () zurück. Standardmäßig sind die von Rand () zurückgegebenen Zufallszahlen von 0 bis GetRandmax () , aber Sie können diesen Bereich ändern, indem Sie zwei Parameter übergeben, wie unten gezeigt:
<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">// erzeugen 1 ankommen 100 Zufällige Zahl zwischen</span></span><span>
</span></span>
Mit der Funktion von GetRandMax () wird der maximale Ganzzahlwert zurückgegeben, den die Rand () -Funktion erzeugen kann. Einfach ausgedrückt, gibt es Ihnen die Obergrenze des Rand () -Rendierungswerts mit. Die Größe dieses Wertes wird nicht festgelegt, wird jedoch durch die Implementierung von PHP und den Algorithmus zur Erzeugung von Zufallszahlen der Systemplattform bestimmt.
<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">// zurückkehren rand() Der Maximalwert der Funktion</span></span><span>
</span></span>
Zunächst sollte klar sein, dass der von getRandmax () zurückgegebene Höchstwert mit der Implementierung der Zufallszahlerzeugung der Plattform und des PHP zusammenhängt und nicht unbedingt eine feste Konstante ist. Die Rand () -Funktion generiert eine Zufallszahl basierend auf dieser Obergrenze, sodass der von Rand () zurückgegebene Wert den Maximalwert von getRandmax () nicht überschreiten sollte.
In der Praxis kann der von Rand () zurückgegebene Höchstwert jedoch nicht die Obergrenze von GetRandmax () auf einigen Plattformen oder einigen PHP -Konfigurationen erreichen, was normalerweise aus den folgenden Gründen liegt:
Verschiedene Implementierungsunterschiede zwischen verschiedenen Plattformen <br> Die Implementierung von Rand () und GetRandmax () kann zwischen Betriebssystemen oder Hardwarearchitekturen variieren. Beispielsweise verwenden einige Plattformen verschiedene Pseudo-Random-Zahlengeneratoren (PRNGs), und die maximalen Werte dieser Generatoren sind nicht konsistent. Obwohl GetRandmax () einen theoretischen Maximalwert zurückgibt, kann dieser Wert aufgrund unterschiedlicher Implementierungen im Bereich der tatsächlich generierten Zufallszahlen möglicherweise nicht erreicht werden.
Interne Implementierung von PHP
PHP kann einige Anpassungen zur Implementierung der Rand () -Funktion in verschiedenen Versionen haben. In einigen Versionen von PHP kann Rand () verschiedene Algorithmen verwenden, um Zufallszahlen zu generieren, was zu dem von GETRANDMAX () zurückgegebenen Höchstwert und dem von Rand () zurückgegebenen Maximalwert führt. Dies hängt normalerweise mit dem Design und der Optimierung des Algorithmus zusammen.
Zufallszahlenalgorithmus verwendet
Der von PHP verwendete Algorithmus zur Erzeugung von Zufallszahlen kann den in einigen Fällen zurückgegebenen Maximalwert einschränken. Wenn Sie beispielsweise einen linearen Algorithmus Conguent Generator (LCG) verwenden, deckt der Zeitraum und der Bereich der generierten Zufallszahlen möglicherweise nicht alle möglichen Werte von getRandmax () ab. Fortgeschrittene Zufallszahlengeneratoren wie Mersenne Twister bieten normalerweise einen größeren Bereich und eine Zufallszahl von höherer Qualität.
Wenn Sie sicherstellen möchten, dass der von Rand () zurückgegebene Höchstwert mit GetRandmax () übereinstimmt, können Sie die folgenden Methoden verwenden:
Verwenden Sie mt_rand () anstelle von rand ()
mt_rand () verwendet den Mersenne -Twister -Algorithmus, der normalerweise einen größeren Bereich von Zufallszahlen erzeugt und einheitlicher ist, wodurch der Maximalwert von getRandmax () besser übereinstimmt.
<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">// verwenden mt_rand() Holen Sie sich zufällige Zahlen</span></span><span>
</span></span>
Manueller Grenzbereich <br> Wenn Sie Rand () verwenden müssen und sicherstellen möchten, dass der Wert GetRandmax () nicht überschreitet, können Sie die Zufallszahl manuell abrufen. Sie können min () und max () Funktionen verwenden, um sicherzustellen, dass der Rückgabewert die maximale Grenze nicht überschreitet:
<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">// Stellen Sie sicher, dass Sie den Maximalwert nicht überschreiten</span></span><span>
</span></span>
Die von GetRandmax () und Rand () -Funktionen zurückgegebenen Höchstwerte können variieren, hauptsächlich aufgrund von Faktoren wie PHP -Implementierung, Plattformunterschieden und dem verwendeten Zufallszahlalgorithmus. Obwohl sie normalerweise die gleiche Obergrenze haben, können Unterschiede bei der tatsächlichen Verwendung auftreten, insbesondere unter verschiedenen Betriebssystemen oder Hardware -Architekturen.
Wenn Sie einen Zufallszahlengenerator mit höherer Qualität benötigen, ist MT_RAND () eine bessere Wahl, da er auf dem Mersenne -Twister -Algorithmus basiert, der normalerweise in der Lage ist, einen größeren Bereich von Zufallszahlen zu erzeugen und eine bessere Einheitlichkeit aufweist.