4

Pythonのrandom関数の「精度」とはどういう意味なのか気になります。ここで説明されています:

random()ほとんどすべてのモジュール関数は、セミオープン範囲[0.0、1.0)で均一にランダムフロートを生成する基本関数に依存しています。Pythonは、コアジェネレーターとしてメルセンヌツイスターを使用します。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ビットはジェネレーターに固有の制限ではありません。floatの精度は53ビットであるため、floatを要求したときにPythonが返す量です。

random.getrandbitsなどを使用して、ランダムな整数を直接取得できます。

より詳細には、CPythonで使用されるメルセンヌツイスターは一度に32ビットを生成します。モジュールコードはこれを2回呼び出し、結果を組み合わせて53ビットのfloatを生成します。getrandbitsを呼び出すと、kビットを生成するために必要な回数だけ内部関数が呼び出されます。このためのコードはここにあります。

于 2012-07-28T19:54:23.560 に答える
4

Pythonが行うことは、MT19937の32ビットバージョンを2回呼び出すことで64ビットのランダム性を生成することですが、その数は[0.0, 1.0)結果に制限されるため、53ビットの精度(浮動小数点形式の制限)に制限されます。

クラスを使用する場合、PythonはWindows (サポートされている場合)random.pyからビットをプルすることができます。それ以外の場合は、MT19937への繰り返し呼び出しから連続するビットをプルすることにより、より大きな数を生成します。/dev/urandomCryptGenRandomrandom.SystemRandom

于 2012-07-28T19:55:00.383 に答える