(PHP 8 >= 8.2.0)
Random\Engine::generate â ãŠãŗãã ãĒå¤ãįæãã
ãŠãŗãã ãĒå¤ãįæãããĸãĢã´ãĒãēã ãŽå é¨įãĒãšããŧããã˛ã¨ã¤é˛ããžãã
ãŠãŗãã ãĒå¤ã¯ããŠãŗãã ãĒãã¤ãåãåĢãã ãã¤ããĒæååã¨ããĻ襨įžãããžãã ãã襨įžãããã¨ã§ããĸãĢã´ãĒãēã ãįæãããŠãŗãã ãĒããããã ææ§ãããĒãåŊĸã§č§Ŗéã§ãããããĢãĒããžãã ããã¯ãã¨ãã°ããĸãĢã´ãĒãēã ãĢããŖãĻį°ãĒãåēåãĩã¤ãēãčĒŋæ´ããįŽįããããžãã
æ´æ°ãŽå¤ããã¤ããŖãã§æäŊãããĸãĢã´ãĒãēã ã¯ã
ãã¨ãã° pack() éĸæ°ãĢ P
ããŠãŧããããŗãŧããæåŽãããĒãŠããĻããĒããĢã¨ãŗããŖãĸãŗã§æ´æ°å¤ãčŋããšãã§ãã
Random\Randomizer ãæäžããéĢãŦããĢã¤ãŗãŋãŧãã§ã¤ãšã¯ã
æ°å¤čĄ¨įžãåŋ
čĻãĒå ´åãčŋããããŠãŗãã ãĒãã¤ãåãįŦĻåˇãĒããŽãĒããĢã¨ãŗããŖãĸãŗã¨ããĻč§Ŗéããžãã
čŋãããæååãŽåã ãŽãããã¯ã įįĸēįãĢããã¤įŦįĢãĢé¸ã°ããįļæ ãĢãããã¨ãåŧˇãæ¨åĨ¨ããžãã ãĸããĒãąãŧãˇã§ãŗãĢããŖãĻã¯ãæŖããåäŊããčĻäģļãã ããããŦããĢã§ãŠãŗãã ã§ãããã¨ãĢäžåããå ´åãããããã§ãã ãã¨ãã° įˇåŊĸååæŗ(LCGs) ã¯ãæ´æ°ãŽä¸äŊããããĢã¤ããĻã¯åčŗĒãäŊããŠãŗãã ãĒå¤ãįæããããã ããããŦããĢã§ãŠãŗãã ãĒįļæ ãåŋ é ã¨ãããĸããĒãąãŧãˇã§ãŗãĢã¯éŠããĻããžããã
ããŽéĸæ°ãĢã¯ããŠãĄãŧãŋã¯ãããžããã
ãŠãŗãã ãĒãã¤ãåãåĢããįŠēã§ãĒãæååãčŋããžãã
æŗ¨æ: Random\Randomizer ã¯å é¨įãĢãįŦĻåˇãĒããŽ64ãããæ´æ°ãäŊŋãŖãĻåäŊããžãã čŋãããæååã 64ããã(8ãã¤ã)äģĨä¸ãŽãŠãŗãã ãĒæååã§ããå ´åã 64ããããčļ ãããã¤ãåã¯įĄčĻãããžãã äģãŽãĸããĒãąãŧãˇã§ãŗã§ã¯ã 64ãããäģĨä¸ãŽããŧãŋãä¸åēĻãĢåĻįã§ããããŽããããããããžããã
äž1 Random\Engine::generate() ãŽäž
<?php
/**
* 65536 ãæŗã¨ãã LCG(Linear Congruential Generator, įˇåŊĸååæŗ)ãåŽčŖ
ãã
* 61 ãæããĻ 17 ãčļŗãã8ããããŽæ´æ°ãčŋããžãã
*
* æŗ¨æ: ããŽã¨ãŗã¸ãŗã¯ããĸãŽį¨éãŽãŋãĢéŠããåŽčŖ
ã§ãã
* LCG ã¯ä¸čŦįãĢãäŊãåčŗĒãŽãŠãŗãã ãĒå¤ããįæããžãããã
* ããã§į¤ēãåŽčŖ
ã¯ã16ãããã¨ããã¨ãĻãįã卿ããæãŖãĻããžããã
* ããã¯ãæŽãŠãŽįžåŽãŽéčĻãæēãããžããã
*/
final class LinearCongruentialGenerator implements \Random\Engine
{
private int $state;
public function __construct(?int $seed = null)
{
if ($seed === null) {
$seed = random_int(0, 0xffff);
}
$this->state = $seed & 0xffff;
}
public function generate(): string
{
$this->state = (61 * $this->state + 17) & 0xffff;
return pack('C', $this->state >> 8);
}
}
$r = new \Random\Randomizer(
new LinearCongruentialGenerator(seed: 1)
);
echo "Lucky Number: ", $r->getInt(0, 99), "\n";
?>ä¸ãŽäžãŽåēåã¯äģĨä¸ã¨ãĒããžãã
Lucky Number: 4