Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:112704 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 98551 invoked from network); 1 Jan 2021 19:47:36 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 1 Jan 2021 19:47:36 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 7EEF81804DD for ; Fri, 1 Jan 2021 11:22:52 -0800 (PST) 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_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-ej1-f50.google.com (mail-ej1-f50.google.com [209.85.218.50]) (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 ; Fri, 1 Jan 2021 11:22:51 -0800 (PST) Received: by mail-ej1-f50.google.com with SMTP id ga15so28720130ejb.4 for ; Fri, 01 Jan 2021 11:22:51 -0800 (PST) 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; bh=VT80hcJSz61kjXa1dedSntBc9sY2xTOVMfmf4HeOu4o=; b=M5G3gZkGn/oPe/8IbGekcpHYDGt6zNaSZwk3E6P3mqn59wS9c9gcFEPNmVtzmmMV3q RMpC69v2I9SUpD/GvuZDd9f/hs9+x0RYX1mgjvnfv3LB2C4Wh6qtgfsvELD6X0gnJje/ PcKquj2xIhbXiO7yx4bDVbDWf5bGOzXk2DArPaBTSoxSrvwhbwGOEVy9hsFaMrHpKj/a 7f2Qv4n0NIS5wPjpa7ogf+pEwoQQNjGJ4copAuqSGCKNLkGpNCpUkw59kEvx+H/48hJm d9Ms3aUZE2YBs3y157WQWeQYr6hnHCgtCvsBM3QLB/pXLDY8XTatnLQewt7THdSb1zjj 9ntg== 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; bh=VT80hcJSz61kjXa1dedSntBc9sY2xTOVMfmf4HeOu4o=; b=PBXhxRDXzXINEANOrLJwUudjreobpdTcCBFG94kFvLMWJeyu7OR7cTCaf0WeUDGhwL 7CblaWu34Saz1yGck6qhUk4qeYFMoFxpnVMWt8VZqKtLDxbzFUnF+VnoghBmPHoC0y2q wMMfgIk3cTQLODt9bjiUKwRFPH2UY+Seyx7RYIPSrMf4/z7ZdwoOT0R92FrTLk/xTrSR GUHMsfeOECMvp3Hj8eYeNIGgcQVAvb0GASyMNoM+dZU9JEZ/rRLVrNnEhmP6rZySKmzS ezjJBhfidByd4vKzX7FoJ6wVgHa+3kTV5h+U/rf42KYUu0wOPHBfeyzza5YMhTVKECSx lWgg== X-Gm-Message-State: AOAM531QoCUVFFIKKX224uxjLgDWzrVci5R92orOKnG0qssiZV4IdggF g27choKk6rtbXJc7c9wC//oetH1YF+9ph+ttEgDLsQ1yvGkmbQ== X-Google-Smtp-Source: ABdhPJzebCYxtqhg0CI5FuD4M1r63ai1z6eOLIBY3TRqBrmnja/E2aNcGFubTj2aOzeQ+iWa++JNvj0bVpj51dZQDzQ= X-Received: by 2002:a17:906:1f8e:: with SMTP id t14mr58824698ejr.350.1609528968413; Fri, 01 Jan 2021 11:22:48 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: Date: Sat, 2 Jan 2021 04:22:37 +0900 Message-ID: To: Marc , internals@lists.php.net Content-Type: multipart/alternative; boundary="0000000000006b101d05b7dbaa97" Subject: Re: [PHP-DEV] Re: Improving PRNG implementation. From: zeriyoshi@gmail.com (Go Kudo) --0000000000006b101d05b7dbaa97 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Marc, and sorry for the late reply. Email has been marked as spam... > I would expect the Random number generator to implement from Iterator using an integer for current() value > and providing utility functions (simple functions or methods of another class) for shuffle, random array entry like this: Thank you very much. This suggestion makes sense and looks very structured. However, I feel that in the PHP world, this structuring is a bit too much. Ease of use is very important in PHP. Nevertheless, I am satisfied with this proposal. I'd like to hear from someone who is more familiar with the PHP context about the form of the implementation. But, it may be faster to actually hold a vote to ask this question. I'm not sure how much support this proposal has at this point, but do you think it's worth a try? 2020=E5=B9=B412=E6=9C=8829=E6=97=A5(=E7=81=AB) 18:26 Marc : > Hi zeriyoshi, > On 23.12.20 14:41, zeriyoshi wrote: > > Thanks tyson. > > > This would also make it easier to use those generators in brand new > > algorithms that weren't in the initial RFC. > > (or in algorithms written by users in PHP) > > This suggestion seems to make sense. Maybe the RNG should only focus on > generating random numbers and not anything else. > However, the fact that array and string manipulation functions are no > longer native to C may have a speed disadvantage. > > So I came up with the idea of minimizing the interface definition as RNG. > > ``` > interface PRNGInterface > { > public function nextInt(?int $min =3D null, ?int $max =3D null): int; > public function nextDouble(): double; // maybe, non-needed. > public function nextByte(int $length): string; > } > ``` > > The methods for array and string operations are defined separately as > interfaces that inherit from the interface. > > ``` > interface RandomInterface extends PRNGInterface > { > public function shuffle(array &$array): bool; > public function arrayRand(array $array, int $num =3D 1): int|string|a= rray; > public function strShuffle(string $string): string; > } > ``` > > This can be overly structured, but it will serve all purposes. > > Personally I feel the interfaces still looking a bit off to me. > > I would expect the Random number generator to implement from Iterator > using an integer for `current()` value > > and providing utility functions (simple functions or methods of another > class) for shuffle, random array entry like this: > > ```php > > interface RNG extends Iterator { > public function rewind(); > public function next(); > public function current(): int; > public function key(): int; > public function valid(); > } > > > interface PRNG extends RNG { > public function __current(int $seed); > public function getSeed(): int; > } > > class RNGUtil { > public static function shuffleArray(int $randomNumber, array $arr): a= rray; > public static function randomArrayElement(int $randomNumber, array $a= rr): mixed; > public static function between(int $randomNumber, int $min =3D PHP_IN= T_MIN, int $max =3D PHP_INT_MAX): int; > public static function bytes(RNG $rng, int $length): string; > } > > ``` > > > Regards, > Go Kudo > > > 2020=E5=B9=B412=E6=9C=8823=E6=97=A5(=E6=B0=B4) 0:40 tyson andre : > > > Hi Go Kudo, > > **A possible alternative that is widely used in other programming > languages is to limit the interface API to only generating bytes/integers= ,** > and to provide global functions that would use generic random number > generator objects (from internal or user-provided code) in their algorith= ms. > > This would also make it easier to use those generators in brand new > algorithms that weren't in the initial RFC. > (or in algorithms written by users in PHP) > > This alternative is similar to Javahttps://docs.oracle.com/javase/7/docs/= api/java/util/Collections.html#shuffle(java.util.List,%20java.util.Random) > and https://docs.oracle.com/javase/7/docs/api/java/util/Random.html > and C++ https://www.cplusplus.com/reference/algorithm/shuffle/ > where the algorithms accept a random number generator conforming to some > interface > and Python https://docs.python.org/3/library/random.html#random.shuffle > > ``` > interface PRNGInterface { > public function random[Signed]Int(): int; // between PHP_INT_MIN and > PHP_INT_MAX (4 bytes or 8 bytes) > public function randomBytes(int $length): string // $length bytes of > raw data > // possibly randomByte(): int // between 0 and 255 > // public function randomIntInRange(int $min, int $max) > // __serialize(), __unserialize() may be provided, but may be > counterproductive for classes that wrap /dev/urandom or random_bytes()? > } > // possibly provide a trait that provides defaults based on abstract > function randomInt > > function whateverprefixornamespace_rand(PRNGInterface $rng, [int $min, in= t > $max]): int {} > // If this is intended to be secure, whateverprefix_array_rand may need t= o > avoid the optimizations used by array_rand for sparse arrays > function whateverprefixornamespace_array_rand(PRNGInterface $rng, array > $array, ...): int {} > function whateverprefixornamespace_shuffle(PRNGInterface $rng, array > &$array): bool; > // alternately might be possible by extending existing global functions > with an optional parameter > ``` > > Thanks, > - Tyson > > --0000000000006b101d05b7dbaa97--