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 <[email protected]>:
>
>> 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