ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pure_PRNG——高质量伪随机数生成器Py库

2021-07-14 09:35:25  阅读:291  来源: 互联网

标签:Pure Py 生成器 instance 算法 随机数 128 prng


  RANDU随机数可视化 这是20世纪60年代IBM发明的RANDU伪随机数生成算法的输出值作三维可视化的样子。用每三个连续输出值为一个点坐标,会清楚看到,这些点只规则的分布在三维空间中的15个平面上!导致那时期很多用到此算法的论文结论都不可靠。 理想的伪随机数生成点预期应该是均匀弥散在整个空间中。 RANDU算法是线性同余生成器(LCG)一类的。 LCG优点是简洁快速,有清晰的数学推导,可计算实现超长周期的满周期参数。 但是,缺点是有连续值之间的序列相关性,造成内在晶格结构。当用于生成n维空间中的点,参数精心选择得当,点就会分布在高维空间的超平面上。参数选择不当,就会像RANDU那样在低维空间的平面上就聚集了。 直接用LCG的输出值是无法通过重重随机数统计检验的, 但是,给输出加个混淆层,就大大改善了输出的统计质量,可以通过一系列随机数统计检验。这就是著名伪随机数生成器PCG算法的原理——LCG+混淆。 非线性的二次同余(QCG)、三次同余(CCG)优缺点基本和LCG一致。 逆同余生成器(ICG)是没有明显晶格结构的,可以直接轻易通过很高维度的统计检验。很适合于金融市场数据模拟等这些高维应用。 见 5.4.3 Inversive Generators 但是,ICG也存在同余类生成器都有的长周期相关现象这个问题。让生成器周期远大于应用需要的周期,长周期相关缺点就不是问题了。   Python random库用的伪随机数生成算法是“Mersenne Twister”(MT)。这算法因其超长周期而被较多采用。 但是,MT这算法通不过一些随机数统计检验(TestU01套件)。算法内部扩散性差,01不均衡。对于需要独立随机数生成器的蒙特卡罗模拟来说,使用MT只在种子值(而不是其他参数)上有差异的多个实例通常并不合适。 我测试整理出能通过多种随机数统计检验套件的PRNG算法,如下:
PRNG算法 周期
Quadratic Congruential Generator(QCG)+混淆 2^256
Cubic Congruential Generator(CCG)+混淆 2^256
Inversive Congruential Generator(ICG) 102*2^256
PCG64_XSL_RR 2^128
PCG64_DXSM 2^128
LCG64_32_ext 2^128
LCG128Mix_XSL_RR 2^128
LCG128Mix_DXSM 2^128
LCG128Mix_MURMUR3 2^128
PhiloxCounter 4*2^(4*64)
ThreeFryCounter 4*2^(4*64)
AESCounter 2^128
ChaChaCounter 2^128
SPECKCounter 2^129
XSM64 2^128
EFIIX64 2^64
SplitMix64 2^64
Ran64 2^64
然后实现了内含这些算法的伪随机数生成器Py库 源码放在GitHub上, https://github.com/fsssosei/Pure_PRNG ​ 已经发布到了PyPI上,可以很方便的安装分发:
pip install pure-prng
导入
from pure_prng_package import pure_prng
很简单可以用起来,默认用的PRNG算法是QCG
>>> seed = 170141183460469231731687303715884105727 #随意写的种子值 >>> prng_instance = pure_prng(seed) >>> source_random_number = prng_instance.source_random_number() >>> next(source_random_number) 65852230656997158461166665751696465914198450243194923777324019418213544382100
QCG、CCG和LCG64_32_ext这三种是可变周期算法
>>> prng_instance = pure_prng(seed, new_prng_period = 2 ** 512) >>> source_random_number = prng_instance.source_random_number() >>> next(source_random_number) 8375486648769878807557228126183349922765245383564825377649864304632902242469125910865615742661048315918259479944116325466004411700005484642554244082978452
其他PRNG算法是固定周期算法 但是,库中有method可设置输出随机数序列的周期(不论哪种PRNG算法生成的随机数)
>>> period = 115792089237316195423570985008687907853269984665640564039457584007913129639747 #随意写的周期 >>> prng_instance = pure_prng(seed) >>> rand_with_period = prng_instance.rand_with_period(period) >>> next(rand_with_period) mpz(65852230656997158461166665751696465914198450243194923777324019418213544381986)
库中还有method生成任意精度浮点随机数
>>> seed = 170141183460469231731687303715884105727 >>> prng_instance = pure_prng(seed) >>> rand_float = prng_instance.rand_float(100) >>> next(rand_float) mpfr('0.56576176351048513846261940831522',100)
 

标签:Pure,Py,生成器,instance,算法,随机数,128,prng
来源: https://www.cnblogs.com/sosei/p/15009355.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有