注:本文“128bit整数范围”指“-2↑127~2↑127-1”。另外,由于编辑器的bug,在非代码部分用“↑”来表示乘方符号
最近我对随机数非常感兴趣,于是我就写了一个范围为**-2↑127~2↑127-1**随机数生成器的代码,下面给出我所写的随机数代码(Python3):
def randfor128bit(n):m=n+4n127=170141183460469231731687303715884105728 #2^127n128=340282366920938463463374607431768211456 #2^128value = [3,4,5]for i in range(m-3):value.append(((value[-3]**3+value[-2]**3-value[-1]**3) % n128)-n127) #[(a↑3+b↑3-c↑3) mod (2↑128)]-2↑127return value[(m-1)] #生成128bit整数范围的随机数
当然,这个生成器是可以被作为模块使用的,下面我们来进行一些测试**(注意:如果你没有把第1个代码保存到random128bit.py,会运行失败):**
前100项输出测试:
import random128bit as r128for i in range(100):print(r128.randfor128bit(i))print("\n")
测试结果1:
170141183460469231731687303715884105694-170141183460469231731687303715884066235-61597115595336-6192367689696445890896122860876846036382983530796783886084632556793100935472-103232277246334793809180636843679978483-1574916793713371247109374051372452621673190832050714783944905572936929803925265331159583971803583010013449304409364049355020355929330380816743889919786966370846253202860884780052297802317624-102066266212488732840818898798154626443-57419084958562110407062541841744347608167440671736959447357964611615848944205545889495941647179365763314834009607602800584000323911238766721171230265173375843064032710969905803537786296142184-104185832826096467235336180276737219091493871614138419161968212145480-29321786585284694499559637465671417035-166622178498551281658027370383853441368-52676001855089685288115130012495218035-16210578532320384373872370156033109287272497252604974562853198467213879795733-129683185124742396939031879863189832216-15948003840423176375367922656880595123691775907289998114188184956714672696-1224355093850602048710699455319818711154416042875462657413832546723579688116978427518795260149040567707037206221-877577633426832556316389728802996249688467860790244512515772357387382555106155505699816005445876683817863126669928-16230476633336786470917850065111945665910008567264169823701117766159070576018448831704944185253954074247972995668149-65210370715898760760317294051425941592-70088550396434673680819321905478748403-10235612382675958467052972716073791296832096756113185515348938980779792396693444924332694205668631384830492087825683642582560818969434511434831149711582159010561555647316841685142271829386552-13280619900968754562039550439372475866764557028612169251684902940255554170901685970562151056901858063436621150853727791310512126851067159588294904-5887649243834808400984171128850328874766439402741421492067962528947428477800-163499425172079805887389097371129362707-16020374393580695004255377585738376122469293783597260167651014811875223707189-16949869748179604637262840651739192-138825275288248885479824572314061405299-161348301290425586878330791979525967240-134997470295832271833004406534949850347117926696572472754860224302237615513576-482087633034033184144108880174458283073430098134842765699045555080087608-137684248848244516110554696690448542987-102063888916042498774922664476460959448949980618057494978954953211237091982858087305090348048278585656543527013368-93135119600174837812557211405350922795-48069315903748312617944293957261927320-98984133002730544722698640648265576595-892968724526158278286405300688852301523240709926094533752056342422688866808523735451129228431993384767654634002856-1125838751512704602599005494156304371132060836783594442768113586754738167160-27841253123003113079516101313582783339-45643048450300915869435436144408346392-118409048710101579752044332479708325459-8784750903138961656467119253058958536-14896301260213932127183397766928945140310858763934462213429441763397406360426432938685458409824840556219692625069133125433889973030332774112945965672965880-17913333861379019350521207321567322283161411664615691840017271937042358209896-105244290599632422185004869606009346067-9796716027822697987054301567115080-33519903137984535995933033246967056075-900413268391560053748244572344158897521096528905880026553263111723217956366156505970787408265262601267331884296312860315355543083081711792480994837147236609725651158902085886503396393448-161484146574241613139184468408738710995-9306058005544470240725672379881087431230183208802520855440512602188274343413-14831878619335460770827613698565218837610093183779784108076691300015520969338910960104639145989554852684191628844287223492756551893083657815205402121132245138661429669235400079974293896671845992113218618556216034631208404980918489197-64941317434207874696232050426878921800-46356074143832362157366783785618747723
集中性测试(集中度=abs(平均数/2↑127),集中度越高,输出的随机数越不均匀):
import random128bit as r128s=0for i in range(100): #种子范围0~99s+=r128.randfor128bit(i)s=s/100 #100项平均数print(abs(s/(2**127)))print("\n")
测试结果2.1:
0.07342919070648801
另一个集中性测试:
import random128bit as r128s=0for i in range(1000): #种子范围0~999s+=r128.randfor128bit(i)s=s/1000 #种子范围0~999print(abs(s/(2**127)))print("\n")
测试结果2.2:
0.059657520898
由此看来,我们生成的随机数比较均匀(前百项集中度约为7.3429%,前千项集中度约为2.0056%)
但是还有一个缺点:复杂度太高,达到了O(n)
可能你们会问:为什么你只用Python做这个随机数生成器,不用C++和Java?
这个生成器用到的数包括:
“170141183460469231731687303715884105728”(2↑127)“340282366920938463463374607431768211456”(2↑128)
其中,2↑128已经超出了128bit整数范围**(-2↑127到2↑127-1),属于256bit整数范围(-2↑255到2↑255-1),如果有个a、b、c中至少一个数的绝对值大于2↑85((2↑85)↑3=2↑255),那就超过了256bit整数范围,属于512bit整数范围。所以,要想用C++和Java做这个生成器,你就必须再建一个512位数据类型——int512bit,非常麻烦,需要350+行代码,你可以参考一下tzwh_86的关于C/C++128bit整数数据类型的文章,他用了377行代码做出了C/C++128bit整数数据类型,把测试部分算进去有405行,如果你真的想做一个int512bit的话,你可能需要更多行代码:/tzwh_86/article/details/8199825?biz_id=102&utm_term=c%8bit&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-8199825&spm=1018.2118.3001.4187
如果觉得《128bit整数范围的随机数生成器》对你有帮助,请点赞、收藏,并留下你的观点哦!