2009-07-10 23 views
2

私は以下の方法でランダムな文字列を生成しました(今はthis methodに切り替えました)。16進数の文字列をPythonに変換する

key = '%016x' % random.getrandbits(128) 

このように生成されたキーは、多くの場合32文字の文字列ですが、31文字が得られます。

これは私が得るものではありません:なぜそれは32の文字ではなく、16ですか? 1桁の16進数字は1文字で印刷できませんか?

だから私が%016xを求めるなら、先頭に0をつけて16文字を期待してはいけませんか?

なぜ文字列legthは常に同じではありませんか?

テストケース

import random 
import collections 
stats = collections.defaultdict(int) 
for i in range(1000000): 
    key = '%016x' % random.getrandbits(128) 
    length = len(key) 
    stats[length] += 1 

for key in stats: 
    print key, ' ', stats[key] 

プリント:

32 937911 
27 1 
28 9 
29 221 
30 3735 
31 58123 

答えて

5

はい、しかし、あなたが使用しているフォーマットは切り捨てられません - あなたは(通常は)必要と128個のランダムビットを生成32 16進数の16進数を意味します。%016は、16進数の16進数を意味しますが、128ビットの数字をすべて表示するために余分な数字を捨てるだけではありません。それが実際に必要とするものならば、ちょうど64個のランダムなビットを生成してみませんか?ランダムジェネレータの作業が少なく、フォーマットの問題もありません。

あなたの好奇心を満たすために、長さは時折31桁です.16桁の1桁がすべて0になるためです。実際には256で1回、すべての上位8ビットは0になりますので、30桁しか取得できません。16桁しか求めていないので、フォーマットは最小の16以上の数字を必要としますあなたが求めていない切り捨て。

3

0〜Fの各16進数文字には、4ビットの情報または半分のバイトが含まれます。 128ビットは16バイトで、1バイトを出力するのに2つの16進文字が必要なので、32文字が得られます。したがって、書式文字列は'%032x'であり、常に32文字の文字列を生成します。

jkugelman$ cat rand.py 
#!/usr/bin/env python 

import random 
import collections 
stats = collections.defaultdict(int) 
for i in range(1000000): 
    key = '%032x' % random.getrandbits(128) 
    length = len(key) 
    stats[length] += 1 

for key in stats: 
    print key, ' ', stats[key] 
jkugelman$ python rand.py 
32 1000000 
関連する問題