注:本文“128bit整数范围”指“-2↑127~2↑127-1”。另外,由于编辑器的bug,在非代码部分用“↑”来表示乘方符号
最近我对随机数非常感兴趣,于是我就写了一个范围为**-2↑127~2↑127-1**随机数生成器的代码,下面给出我所写的随机数代码(Python3):

def randfor128bit(n):
    m=n+4
    n127=170141183460469231731687303715884105728 #2^127
    n128=340282366920938463463374607431768211456 #2^128

    value = [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↑127
    return value[(m-1)] #生成128bit整数范围的随机数

当然,这个生成器是可以被作为模块使用的,下面我们来进行一些测试**(注意:如果你没有把第1个代码保存到random128bit.py,会运行失败):**

前100项输出测试:

import random128bit as r128
for i in range(100):
    print(r128.randfor128bit(i))
    print("\n")

测试结果1:

170141183460469231731687303715884105694


-170141183460469231731687303715884066235


-61597115595336


-61923676896964458908961228608768460363


82983530796783886084632556793100935472


-103232277246334793809180636843679978483


-15749167937133712471093740513724526216


73190832050714783944905572936929803925


26533115958397180358301001344930440936


40493550203559293303808167438899197869


66370846253202860884780052297802317624


-102066266212488732840818898798154626443


-57419084958562110407062541841744347608


167440671736959447357964611615848944205


54588949594164717936576331483400960760


28005840003239112387667211712302651733


75843064032710969905803537786296142184


-104185832826096467235336180276737219091


42021938716141384191619682121420215480


-29321786585284694499559637465671417035


-166622178498551281658027370383853441368


-52676001855089685288115130012495218035


-162105785323203843738723701560331092872


72497252604974562853198467213879795733


-129683185124742396939031879863189832216


-159480038420190423176375367922656880595


123691775907289998114188184956714672696


-122435509385060204871069945531981871115


44162003042875462657413832546723579688


116978427518795260149040567707037206221


-87757763342683255631638972880299624968


84678607902445125157723573873825551061


55505699816005445876683817863126669928


-162304766333367864709178500651119456659


100085672641698237011177661590705760184


48831704944185253954074247972995668149


-65210370715898760760317294051425941592


-70088550396434673680819321905478748403


-102356123826759584670529727160737912968


32096756113185515348938980779792396693


44492433269420566863138483049208782568


36425825608189694345114348311497115821


59010561555647316841685142271829386552


-132806199009687545620395504393724758667


64557028612169251684902940255554170920


14016859705620222151056901858063436621


150853727791310512126851067159588294904


-58876492438348084009841711288503288747


66439402741421492067962528947428477800


-163499425172079805887389097371129362707


-160203743935806950042553775857383761224


69293783597260167651014811875223707189


-169498697481796046372628406517392015192


-138825275288248885479824572314061405299


-161348301290425586878330791979525967240


-134997470295832271833004406534949850347


117926696572472754860224302237615513576


-48208763303403318414410888017445828307


34320130098134842765699045555080087608


-137684248848244516110554696690448542987


-102063888916042498774922664476460959448


94998061805749497895495321123709198285


8087305090348048278585656543527013368


-93135119600174837812557211405350922795


-48069315903748312617944293957261927320


-98984133002730544722698640648265576595


-89296872452615827828640530068885230152


32407099260945337520563424226888668085


23735451129228431993384767654634002856


-1125838751512704602599005494156304371


132060836783594442768113586754738167160


-27841253123003113079516101313582783339


-45643048450300915869435436144408346392


-118409048710101579752044332479708325459


-8784750903138961656467119253058958536


-148963012602139321271833977669289451403


108587639344622134294417633974063604264


32938685458409824840556219692625069133


125433889973030332774112945965672965880


-17913333861379019350521207321567322283


161411664615691840017271937042358209896


-105244290599632422185004869606009346067


-97967160278226201697987054301567115080


-33519903137984535995933033246967056075


-90041326839156005374824457234415889752


10965289058800265532631117232179563661


56505970787408265262601267331884296312


8603153555430830200981711792480994837


147236609725651158902085886503396393448


-161484146574241613139184468408738710995


-93060580055444702407256723798810874312


30183208802520855440512602188274343413


-148318786193354607708276136985652188376


100931837797841080766913000155209693389


109601046391459895548526841916288442872


23492756551893083657815205402121132245


138661429669235400079974293896671845992


113218618556216034631208404980918489197


-64941317434207874696232050426878921800


-46356074143832362157366783785618747723

集中性测试(集中度=abs(平均数/2↑127),集中度越高,输出的随机数越不均匀):

import random128bit as r128
s=0
for i in range(100): #种子范围0~99
    s+=r128.randfor128bit(i)
s=s/100 #100项平均数
print(abs(s/(2**127)))
print("\n")

测试结果2.1:

0.07342919070648801

另一个集中性测试:

import random128bit as r128
s=0
for i in range(1000): #种子范围0~999
    s+=r128.randfor128bit(i)
s=s/1000 #种子范围0~999
print(abs(s/(2**127)))
print("\n")

测试结果2.2:

0.0200559657520898

由此看来,我们生成的随机数比较均匀(前百项集中度约为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的话,你可能需要更多行代码:https://blog.csdn/tzwh_86/article/details/8199825?biz_id=102&utm_term=c%20128bit&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-8199825&spm=1018.2118.3001.4187

更多推荐

128bit整数范围的随机数生成器