Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:114794 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 36154 invoked from network); 9 Jun 2021 09:52:54 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 9 Jun 2021 09:52:54 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 9317E18053C for ; Wed, 9 Jun 2021 03:07:53 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Wed, 9 Jun 2021 03:07:53 -0700 (PDT) Received: by mail-lj1-f174.google.com with SMTP id 131so30949267ljj.3 for ; Wed, 09 Jun 2021 03:07:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=TQc24MfysctFpjfBdg2eue9nW1DCD4zMzuRAglOOM2U=; b=gM7VqdxS9YNl/k0A/lBKhxKxTkbmOc1DcxB5Vj/qLKpCfu0cJkJjWMAzMmKPVl6ijU +3WgBV/U2LmrezDI4TWmBSyIMA3nWFUg9Ly/CG3VFwY8xnEyAXW448k09tlWHCp5LGg6 tcva+xXm28X4g1dKDWeH+VNQ1VGCe3mxaKsu1JLHfp079poIdocgn19njohzxC4+lKXj 6zZ4p3quFM5ALv/shik3I3NpcNAA5oIH2hOk43eqXnxaNTZjPmUvApMhJB/ANf5GV3ls TrWCAcX0rLC4Wi50AR+CBqumGhGNzcWjJ6MDxRaK/IZS+eofgyLHDS4/VxPGQtFjNLHi ydwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=TQc24MfysctFpjfBdg2eue9nW1DCD4zMzuRAglOOM2U=; b=JeHMEYbckqJxhT4HdCinvh8iaGHuLiOh0ck3xR3EE22YSl3YWfGL+oHv/aPijyHGeW ypXQVstbS/CabbXKYli3veJjQd0Hqe+PvD7f+GucwK+lC9iGj5Vk1M4bdJR4w181gcNG y1KEfpCJm4WnKRRJjkkBWsYu9r3Kk9gFvVRvmx/H3DKBu0LtUwSR892Ov4COcRHthzKk GisKkQcwON4xfPOCDjT0vRK95MvS3YAtHApgc4WOX4D+9eR1Lp/sQsuf0ofnKsrQ9Qm9 X6Tay2NMm/A8nyxO2z3TQjVT/wK3xZccQMzyCw+EpzZD0mBDFjJGXB6hiDS5znYlEbJo M2dQ== X-Gm-Message-State: AOAM530g+uE3Zo97ZDhtS4CdJ7AyCYncFAlpwUri9peZTU2BKkgCct96 yOzkku6RjpeO8RvZGCTsyF3TP8p4zZ3NfK/gk9ZbuMe0hQ7oTzA= X-Google-Smtp-Source: ABdhPJzWsjwXMCMujz2dB72Ybq45omt0/mkroVeYWsg5avZFYlFceqqJiFvDf0hhNtmzylh6j5JKPXAptkfmSPr0v5Y= X-Received: by 2002:a2e:9a0d:: with SMTP id o13mr4540843lji.440.1623233269814; Wed, 09 Jun 2021 03:07:49 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Wed, 9 Jun 2021 12:07:38 +0200 Message-ID: To: Go Kudo Cc: PHP internals Content-Type: multipart/alternative; boundary="0000000000006f58f105c4527297" Subject: Re: [PHP-DEV] Re: [RFC] Under Discussion: Add Random class and RandomNumberGenerator interface From: guilliam.xavier@gmail.com (Guilliam Xavier) --0000000000006f58f105c4527297 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello Go Kudo, On Tue, Jun 8, 2021 at 2:33 PM Go Kudo wrote: > Hello iinternals. > > There doesn't seem to be much mention of it. > But, that may be because it has been discussed well in advance. > Thank you for participating in the discussion. > I'm not sure you really addressed https://externals.io/message/114561#11468= 0 ? especially this part: """ If you pick the second option, then you should consistently separate the source for both extension-provided RNGs and user-provided ones. I don't think it makes sense to have extension provided RNGs use a `new Random(RANDOM_XORSHIFT128PLUS)` interface, while user-provided ones use `new Random(new SomeRandomSource)`. Going down this route, it should be `new Random(new XorShift128Plus)`. This is a pure design, which also means that it's more complicated, and may make simple usages harder (though there is certainly room for a Random::createDefault() here.) """ Now, that might sound like it would take us back to the "full OO" version (with multiple classes), which was deemed too "user-*un*friendly" by several people (including me :s), *but* there are some new ideas to consider, e.g. (for the Random class): - add a `public static function createDefault(): self` as suggested by Nikita, or - change `public function __construct` parameters to e.g. `(string $algo =3D XorShift128Plus::class, ?int $seed =3D null, mixed ...$extra_args)` (that would internally do a `new $algo($seed, ...$extra_args)` to store), to be called not as `new Random(new UserDefinedRNG($seed_or_null, $foo, $bar))` but as `new Random(UserDefinedRNG::class, $seed_or_null, $foo, $bar)`. Any new opinions (or other ideas)? > Now, if there is no particular discussion on this, I will try to start th= e > voting phase next week. > Of course, I will contact you separately. > > However, I was looking back at the implementation and found only one poin= t > of concern. > > With the current implementation, the results of the following example wil= l > match. > > ```php > $one =3D new Random(); > $one->nextInt(); > $two =3D clone $one; > > var_dump($one->nextInt() =3D=3D=3D $two->nextInt()); // true > ``` > > But, this is not true for user implementations. > > ```php > class UserRNG implements RandomNumberGenerator > { > protected int $current =3D 0; > > public function generate(): int > { > return ++$this->current; > } > } > > $rng =3D new UserRNG(); > $one =3D new Random($rng); > $one->nextInt(); > $two =3D clone $one; > > var_dump($one->nextInt() =3D=3D=3D $two->nextInt()); // false > ``` > > This is because `$rng` is kept as a normal property and is managed by the > standard PHP mechanism. In other words, it is passed by reference. > > This is not consistent with the built-in RNG behavior. However, I don't s= ee > a problem with this behavior. > I feel that the standard PHP behavior is preferable to changing the > userland behavior in a specific way. > > I would like to solicit opinions. > Couldn't the Random class simply implement `public function __clone(): void` (that would internally do like `$this->algo =3D clone $this->algo;`)? > > Regards, > Go Kudo > > 2021=E5=B9=B46=E6=9C=881=E6=97=A5(=E7=81=AB) 23:28 Go Kudo : > > > Hello internals. > > Thanks for continuing to participate in the discussion. > > > > I've sorted out the proposal, and finished writing and implementing the > > RFC. > > (Funny, I know.) I think it's time to start a discussion. > > > > https://wiki.php.net/rfc/rng_extension > > https://github.com/php/php-src/pull/7079 > > > > The main changes since last time are as follows: > > > > - The ugly RANDOM_USER has been removed. > > - RandomNumberGenerator interface has been added for user-defined RNGs. > > - Random class is now final. > > - Random class now accepts a RandomNumberGenerator interface other than > > string as the first argument to the constructor. > > - INI directive has been removed. In 32-bit environments, the result is > > always truncated. > > > > What I'm struggling with now is the behavior when calling nextInt() in = a > > 32-bit environment using a 64-bit RNG. It currently returns a truncated > > result, which means that the code loses compatibility with the result o= f > > running on a 64-bit machine. > > I was also considering throwing an exception, but which would be > > preferable? > Indeed, a decision has to be made. If you throw an exception, we wouldn't have the "issue" of different results on 32- vs 64-bit machines, but XorShift128+ and Secure would be unusable on a 32-bit machine, right? How do other existing implementations handle this question? > > > I would like to answer a few unanswered questions. > > > > > What is bias? > > > > I' ve confirmed that the bias issue in mt_rand has already been fixed a= nd > > is no longer a problem. > > > > This implementation copies most of it from mt_rand. Therefore, this > > problem does not exist. > > > > Therefore, an equivalent method to mt_getrandmax() is no longer provide= d. > Great! > > > > > uint64 & right-shift > > > > This is a specification of the RNG implementation. PHP does not have > > unsigned integers, but RNG handles unsigned integers (to be precise, ev= en > > the sign bit is random). > > > > As mentioned above, PHP does not have unsigned integers, which means th= at > > using the results generated by RNGs may cause compatibility problems in > the > > future. To avoid this, a 1-bit right shift is always required (similar = to > > mt_rand()). > Good to know, thanks. Regards, --=20 Guilliam Xavier --0000000000006f58f105c4527297--