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 = null, ?int $max = 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 = 1): int|string|array;
>     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): array;
    public static function randomArrayElement(int $randomNumber, array $arr): 
mixed;
    public static function between(int $randomNumber, int $min = PHP_INT_MIN, 
int $max = PHP_INT_MAX): int;
    public static function bytes(RNG $rng, int $length): string;
}

```


>
> Regards,
> Go Kudo
>
>
> 2020年12月23日(水) 0:40 tyson andre <tysonandre...@hotmail.com>:
>
>> 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 algorithms.
>>
>> 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 Java
>> https://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, int
>> $max]): int {}
>> // If this is intended to be secure, whateverprefix_array_rand may need to
>> 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

Reply via email to