2009-07-10 85 views
2

我用以下方式生成隨機字符串(現在我已切換到this method)。十六進制到python中的字符串格式轉換

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

產生這種方式的關鍵是最常見的是32字符串,但一旦我有31個字符。

這是我不明白:爲什麼它是32個字符,而不是16?一個十六進制數字是否需要打印一個字符?

所以,如果我要求%016x-不應該有人預期16個可能的前導零字符?

爲什麼string 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十六進制數字顯示,並且%016意味着至少16位十六進制數字,但不會丟掉所需的額外數字,以顯示所有該128位數字。爲什麼不生成64個隨機位,如果這是你真正需要的?隨機生成器的工作量較少,無格式問題。

爲了滿足您的好奇心,長度偶爾會有31位數字,因爲16位中的1次頂部4位都是0;實際上1次256位的所有前8位都是0,所以你只能得到30位數字等等。你只要求16位數字,所以格式化會給出最少的數字大於等於16,並且不需要你沒有要求的截斷。

3

從0到F的每個十六進制字符都包含4位信息或半個字節。 128位是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 
相關問題