Random\Engine::generate

(PHP 8 >= 8.2.0)

Random\Engine::generate — ãƒŠãƒŗãƒ€ãƒ ãĒå€¤ã‚’į”Ÿæˆã™ã‚‹

čĒŦ明

public function Random\Engine::generate(): string

ãƒŠãƒŗãƒ€ãƒ ãĒå€¤ã‚’į”Ÿæˆã—ã€ã‚ĸãƒĢゴãƒĒã‚ēãƒ ãŽå†…éƒ¨įš„ãĒ゚テãƒŧãƒˆã‚’ã˛ã¨ã¤é€˛ã‚ãžã™ã€‚

ãƒŠãƒŗãƒ€ãƒ ãĒå€¤ã¯ã€ãƒŠãƒŗãƒ€ãƒ ãĒバイト列をåĢんだバイナãƒĒ文字列としãĻčĄ¨įžã•ã‚Œãžã™ã€‚ ãã†čĄ¨įžã™ã‚‹ã“ã¨ã§ã€ã‚ĸãƒĢゴãƒĒã‚ēãƒ ãŒį”Ÿæˆã—ãŸãƒŠãƒŗãƒ€ãƒ ãĒビットを、 曖昧さがãĒいåŊĸã§č§Ŗé‡ˆã§ãã‚‹ã‚ˆã†ãĢãĒりぞす。 これはたとえば、ã‚ĸãƒĢゴãƒĒã‚ēムãĢã‚ˆãŖãĻį•°ãĒるå‡ē力ã‚ĩイã‚ēをčĒŋæ•´ã™ã‚‹į›Žįš„ãŒã‚ã‚Šãžã™ã€‚

æ•´æ•°ãŽå€¤ã‚’ãƒã‚¤ãƒ†ã‚Ŗãƒ–ã§æ“äŊœã™ã‚‹ã‚ĸãƒĢゴãƒĒã‚ēムは、 たとえば pack() é–ĸ数ãĢ P フりãƒŧãƒžãƒƒãƒˆã‚ŗãƒŧドを指厚するãĒおしãĻ、ãƒĒトãƒĢã‚¨ãƒŗãƒ‡ã‚Ŗã‚ĸãƒŗã§æ•´æ•°å€¤ã‚’čŋ”すずきです。 Random\Randomizer が提䞛するé̘ãƒŦベãƒĢã‚¤ãƒŗã‚ŋãƒŧフェイ゚は、 æ•°å€¤čĄ¨įžãŒåŋ…čρãĒ場合、čŋ”ã•ã‚ŒãŸãƒŠãƒŗãƒ€ãƒ ãĒバイト列をįŦĻåˇãĒしぎãƒĒトãƒĢã‚¨ãƒŗãƒ‡ã‚Ŗã‚ĸãƒŗã¨ã—ãĻč§Ŗé‡ˆã—ãžã™ã€‚

čŋ”された文字列ぎ個々ぎビットは、 į­‰įĸēįŽ‡ãĢ、かつį‹ŦįĢ‹ãĢ選ばれたįŠļ態ãĢあることをåŧˇãæŽ¨åĨ¨ã—ぞす。 ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãĢã‚ˆãŖãĻã¯ã€æ­Ŗã—ãå‹•äŊœã™ã‚‹čρäģļが、 ビットãƒŦベãƒĢã§ãƒŠãƒŗãƒ€ãƒ ã§ã‚ã‚‹ã“ã¨ãĢ䞝存する場合があるからです。 たとえば ᎚åŊĸåˆåŒæŗ•(LCGs) は、整数ぎ下äŊãƒ“ットãĢついãĻは品čŗĒがäŊŽã„ãƒŠãƒŗãƒ€ãƒ ãĒå€¤ã‚’į”Ÿæˆã™ã‚‹ãŸã‚ã€ ビットãƒŦベãƒĢã§ãƒŠãƒŗãƒ€ãƒ ãĒįŠļ態をåŋ…須とするã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãĢは遊しãĻいぞせん。

ãƒ‘ãƒŠãƒĄãƒŧã‚ŋ

こぎé–ĸ数ãĢã¯ãƒ‘ãƒŠãƒĄãƒŧã‚ŋはありぞせん。

æˆģり値

ãƒŠãƒŗãƒ€ãƒ ãĒバイト列をåĢむ、įŠēでãĒい文字列をčŋ”しぞす。

æŗ¨æ„: Random\Randomizer ã¯å†…éƒ¨įš„ãĢ、įŦĻåˇãĒしぎ64ビット整数をäŊŋãŖãĻ動äŊœã—ぞす。 čŋ”される文字列が 64ビット(8バイト)äģĨä¸ŠãŽãƒŠãƒŗãƒ€ãƒ ãĒ文字列である場合、 64ビットをčļ…ãˆã‚‹ãƒã‚¤ãƒˆåˆ—ã¯į„ĄčĻ–ã•ã‚Œãžã™ã€‚ äģ–ぎã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã§ã¯ã€ 64ビットäģĨ上ぎデãƒŧã‚ŋを一åēĻãĢå‡Ļį†ã§ãã‚‹ã‚‚ãŽãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œãžã›ã‚“ã€‚

エナãƒŧ / 䞋外

  • ãƒŠãƒŗãƒ€ãƒ ãĒå€¤ã‚’į”Ÿæˆã§ããĒã‹ãŖãŸå ´åˆã€ Random\RandomException が゚ロãƒŧされぞす。 å€¤ã‚’į”Ÿæˆã—ãĻいる途中で゚ロãƒŧされるäģ–ぎ Exception は、 ã‚­ãƒŖãƒƒãƒã•ã‚ŒãĻ Random\RandomException でナップされぞす。
  • čŋ”される文字列がįŠēぎ場合、 Random\Randomizer が Random\BrokenRandomEngineError を゚ロãƒŧしぞす。
  • åŽŸčŖ…ã•ã‚ŒãĻいるã‚ĸãƒĢゴãƒĒã‚ēムãĢとãĻもåŧˇã„偏りがある場合、 Random\Randomizer が Random\BrokenRandomEngineError を゚ロãƒŧする場合がありぞす。 これは、偏りがãĒいįĩæžœã‚’čŋ”すためãĢæŖ„å´ã‚ĩãƒŗãƒ—ãƒĒãƒŗã‚°ãŒåŋ…čρãĒ時ãĢ、 į„Ąé™ãƒĢãƒŧプãĢé™Ĩることをéŋけるためです。

例

例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
īŧ‹add a note

User Contributed Notes

There are no user contributed notes for this page.