注:本文“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整数范围的随机数生成器
发布评论