On Tue, May 25, 2021 at 5:36 PM Go Kudo <zeriyo...@gmail.com> wrote: > Hi, Thanks for the response. > > The RFC has been revised based on the points you pointed out. > > https://wiki.php.net/rfc/rng_extension >
Thanks, it looks like you have addressed all previous points (for me at least). But also introduced a new one ;) with the new `static function getNonBiasedMax(string $algo): int`... (Note: I think some questions below could be answered by the list in general, not only Go Kudo.) Let's compare these two equivalent functions: function f1(int $seed): void { mt_srand($seed); $a = mt_rand(); $b = mt_rand(); var_dump($a, $b); } function f2(int $seed): void { $random = new Random(RANDOM_MT19937, $seed); $max = Random::getNonBiasedMax(RANDOM_MT19937); $a = $random->getInt(0, $max); $b = $random->getInt(0, $max); var_dump($a, $b); } In particular, note that we did *not* need to write the explicit/long version of f1: function f1_explicit(int $seed): void { mt_srand($seed); $max = mt_getrandmax(); $a = mt_rand(0, $max); $b = mt_rand(0, $max); var_dump($a, $b); } But what would happen with the implicit/short version of f2? function f2_implicit(int $seed): void { $random = new Random(RANDOM_MT19937, $seed); $a = $random->getInt(); $b = $random->getInt(); var_dump($a, $b); } Would we get "biased" results (by the way, what does that mean exactly)? like `mt_rand(PHP_INT_MIN, PHP_INT_MAX)`? Couldn't the default min/max be made "safe"? or maybe "dynamic" depending on the algo/implementation? Also, let's consider this: function g(Random $random): void { $max = /* ??? */; $a = $random->getInt(0, $max); $b = $random->getInt(0, $max); var_dump($a, $b); } Here, how to get the "non-biased max" for this Random instance (unknown algo)? Moreover, what would `Random::getNonBiasedMax(RANDOM_USER)` return? I think we would rather want/need to call e.g. `FixedNumberForTest::getNonBiasedMax()` (potentially overridden)? Maybe you could add a (non-static) `function getAlgo(): string`, so we could at least call `$random::getNonBiasedMax($random->getAlgo())`? (maybe it could also be more generally useful, possibly along with a `getSeed()`, akin to `password_get_info(string $hash)`?) or a non-static `function getNonBiasedMax(): int`, and rename the static one? (or even drop it after all? how often will we need it without having an instance? and if needed, is `new Random($algo, 0)` a costly operation?) or some other solution someone can think of? Ah that made me think: should some methods better be `final`? Finally, the current "Open Issues" section should probably renamed to "Discussion" or even "FAQ" here? Regards, -- Guilliam Xavier