4

我想知道 Pythonrandom函数的“精度”是什么意思。这里描述:

几乎所有的模块函数都依赖于基本函数random(),它在半开放范围[0.0, 1.0)内均匀地生成一个随机浮点数。Python 使用 Mersenne Twister 作为核心生成器。它产生 53 位精度浮点数,周期为 2**19937-1。

(http://docs.python.org/library/random.html?highlight=mersenne%20twister,访问 20120727)

我感兴趣的是我可以生成非常大的随机整数(长整数),其精度似乎远高于 2^53。例如(使用 Ipython):

In [1]: from math import factorial as F
In [2]: from random import randint as R
In [3]: R(1, F(900))
Out[3]: 55655511302846458744179265243566263049348396362730789786376014445325896599604354914431619960209388364677180234108513221468671377813842671874148746886513973171423907294544220953849330089822288697383171078250181973489187774341795574648920075697792011317798969959919449394758519496792725695600701199089972009688412593325291810024048811890509220571436407156566269358600296506017343255050788936280200352509087073097532486502694101150248815092174847010359868156616901409331336760344351058867833528749797221612169430654334458578364850198977511061993233818849689759090377347376020160658362459773356292085856906573553086825560047089834757501023094429371408722563891227474029563545206865055657504766128286451181119906678062837368414582707728324415466848186858173236300969443478496634754744888060794778485246692104851885847515244146665974598354436781340057667983223238998674622833320199904840957000014767293658171874973067958145430346745707636676061629278168015549755791407108399231392952706279787486238512258804098030513575025870504347283221015756832157863142353915612138589145084128778032995695113870365505775392647256056048691602676699581153972467494111720212363912926352356346807790816796784781384561736415741104584667536002819103176714157723039428367564698686945824679882523439229215035996634289075127375256728472056511244548311771570743103809147045947583819651257115044154025329883682429231394004470689760531056853018427649916035935302356382633012319775473728455377657692268855776796385819792347680100513177355101630543290088996770992548670273727988974570199179655691444984337837105283447276788151912408533352627494948390016029881755603243934955207024221452181883522004648595373130617729041347013155205217774450836687880723915563507108222768637840614647145898936109917167237397888104669458661404234553707323638883064861414284282190898741067404128885188113697448726481104763682489126524054241797759521120664366845719767486252884585742737830119890190213053751046461419643379561983590174574185268661318409035375114305279020423595250660644954841798619767985549553380200803904976806468796334648515423467654573415304912570341635682203261002606581817207689816015969520503052648773609840260050676394927780076948629298559638703440007364834579712680931643829764810072128419905903786966L

我想知道 53 位在什么意义上是random函数的精度限制。具体来说,如果我要求 Python 返回介于 1 和某个非常大的上限之间的伪随机数,那么该范围内的所有整数是否都具有相同的返回可能性?

4

2 回答 2

4

53 位不是生成器的固有限制,它是 Python 在请求浮点数时返回的数量,因为浮点数具有 53 位精度。

您可以使用诸如 random.getrandbits 之类的东西直接获取随机整数。

更详细地说,CPython 中使用的 Mersenne Twister 一次生成 32 位。模块代码调用了两次,并结合结果生成一个 53 位浮点数。如果您调用 getrandbits,它将根据需要多次调用内部函数以生成 k 位。可以在此处找到此代码。

于 2012-07-28T19:54:23.560 回答
4

Python 所做的是通过两次调用 32 位版本的 MT19937 生成 64 位随机性,但由于该数字被限制为[0.0, 1.0)结果,因此被限制为 53 位精度(浮点格式的限制)。

如果您使用该类, Pythonrandom.py能够从/dev/urandomWindows 或 Windows CryptGenRandom(如果支持)中提取位。random.SystemRandom否则,它会通过从重复调用 MT19937 中提取连续位来生成更大的数字。

于 2012-07-28T19:55:00.383 回答