On Tue, May 25, 2021 at 5:36 PM Go Kudo <[email protected]> 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