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

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^12

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上,pure-prng - Python Package Health Analysis | Snyk

已经发布到了PyPI上,可以很方便的安装分发:

pip install pure-prng

导入

from pure_prng_package import pure_prng

很简单可以用起来,默认用的PRNG算法是CCG

>>> 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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,431评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,637评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,555评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,900评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,629评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,976评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,976评论 3 448
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,139评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,686评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,411评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,641评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,129评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,820评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,233评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,567评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,362评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,604评论 2 380

推荐阅读更多精彩内容