savvot / random
具有数十个有用函数和多个随机数源的确定性伪随机数生成器库
v0.3.0
2015-09-26 15:48 UTC
Requires
- php-64bit: >=5.5.0
Requires (Dev)
- phpunit/phpunit: 4.8.*
This package is not auto-updated.
Last update: 2024-09-14 18:04:13 UTC
README
这一系列类为不同的伪随机生成器提供了基本的抽象,具有相同的通用API。它还包含许多有用的辅助方法,如加权随机、文本生成、洗牌、数组函数等。
警告:这些PRNGs不是加密安全的(mt_rand()也是)
为什么不使用mt_rand()呢?
PHP内建的mt_rand()和rand()是全局函数,因此无法创建具有不同预定义种子并同时使用的多个生成器。也无法控制随机序列的当前状态。
功能
- 具有可选种子的确定性随机生成器
- 正确的均匀分布
- 基于Ziggurat算法的正态分布随机数采样器
- 可扩展的架构:很容易添加您自己的随机数源
- 种子可以是任何长度的字符串
- 可以在任何时候保存和恢复当前PRNG的状态,因此可以从已知状态重放序列
- 不同的随机类型:int,float,boolean
- 加权随机:根据权重随机数组键,加权洗牌
- 随机二进制数据生成
- 从指定的字符列表生成随机文本,可选的多字节支持
- 数组方法,是array_rand和shuffle的替代品
PRNG来源
-
XorShiftRand 快速且质量好的随机生成器,基于XorShift+算法,具有128位状态。在大多数情况下都应该使用。
-
MtRand Mersenne twister算法的内置mt_rand变体的纯PHP实现。使用相同int种子生成的两种方法的随机序列将完美匹配,因此这个生成器与mt_rand()完全兼容,可以用作替代品。
-
HashRand 一种证明概念,表明md5散列均匀分布,可以用作伪随机数的源。非常快速且直接。
示例
//////// BASIC USAGE //////// // Create xorshift random generator with default random seed $rnd = new XorShiftRand(); // Default random value between 0 and GeneratorClass::INT_MAX $value = $rnd->random(); // Random value within given range (inclusive) $value = $rnd->random(15, 12333); // Negative numbers allowed $value = $rnd->random(-128, 128); // Random unsigned int, size depends on underlying generator $int = $rnd->randomInt(); // Random float in range 0 <= $val <= 1 $float = $rnd->randomFloat(); // True or false $bool = $rnd->randomBool(); //////// STATE CONTROL //////// // Read current seed $seed = $rnd->getSeed(); // Set new seed, generator will be reinitialized $rnd->setSeed('some new seed'); // .... several generator calls later ... // Save state for future use $state = $rnd->getState(); // .... several generator calls later ... // Set saved state and restore generator to known state $state = $rnd->setState($state); // .... same calls to random methods as before will produce exactly the same output // Reset generator to initial state with current seed ('some new seed') $rnd->reset(); //////// STRING METHODS //////// // Generate string with 256 random bytes $bytes = $rnd->randomData(256); // Generate random string from default (ALNUM) characters list with length = 17 $str = $rnd->randomString(17); // Generate random string from numbers (0-9) with length = 99 $str = $rnd->randomString(99, $rnd::CL_NUM); // Generate lowercase hex string with length = 32 $str = $rnd->randomString(32, $rnd::CL_HEXLC); // Generate string from custom characters list $str = $rnd->randomString(16, 'ABCDefgh#$%^'); // If custom list contains multi-byte characters, $mb flag must be set $str = $rnd->randomString(16, 'АБВГДЕЁЖЗ', true); //////// ARRAY METHODS //////// // Get random key from array (0, 1, 2 or 'four') $key = $rnd->arrayRand([10, 20, 30, 'four' => 40]); // Get random value from array (10, 20, 30 or 4) $value = $rnd->arrayRandValue([10, 20, 30, 'four' => 40]); // Shuffle array. New numeric keys will be assigned $array = [1, 2, 'key' => 3, 4, 'assoc' => 5, 6, 7]; $rnd->arrayShuffle($array); // Shuffle array and maintain key => value associations $array = [1, 2, 'key' => 3, 4, 'assoc' => 5, 6, 7]; $rnd->arrayShuffleAssoc($array); //////// WEIGHTED RANDOM //////// // Array in "key => weight" form must be specified $array = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'four2' => 4]; // Get random key from array by weights. // So 'one' will appear less likely than 'four'\'four2' $key = $rnd->arrayWeightRand($array); // Shuffle array using weights. // So 'four'\'four2' likely will appear earlier than 'one' in resulting array $rnd->arrayWeightShuffle($array);
更多信息
- PRNG: https://en.wikipedia.org/wiki/Pseudorandom_number_generator
- XorShift: https://en.wikipedia.org/wiki/Xorshift
- Mersenne Twister: https://en.wikipedia.org/wiki/Mersenne_Twister
- 一些PRNGs基准测试:http://xorshift.di.unimi.it/
- 正态分布: https://en.wikipedia.org/wiki/Normal_distribution
- Ziggurat算法: https://en.wikipedia.org/wiki/Ziggurat_algorithm