以前的做法是用for迴圈隨機地獲取乙個個字元後再拼接起來
今天在網上看到乙個非常簡練的寫法,在這裡分享一下
import os
def randomstring(n):
return (''.join(map(lambda xx:(hex(ord(xx))[2:]),os.urandom(n))))[0:16]
print randomstring(16)
這些函式之前都沒見過,之前接觸的python內建函式比較少...
os.urandom(n) : 隨機生成n個位元組的串,乙個位元組是8位,我猜是這8位二進位制數是隨機的,所以這個位元組也是隨機的。所以沒有指定的編碼方案可以很好地把所有這個字串顯示轉換成功,即有可能會亂碼
再介紹一下map函式,它的第乙個引數是乙個函式(可以說是乙個對映函式),第二個引數是乙個元組或者列表(iterative),它將iterative的每個元素作為引數依次傳入對映函式,將所有返回值分別作為元素,最後形成乙個列表返回。
ord(xx):以乙個字元(python是乙個位元組也即8位),計算其unicode 碼值的十進位制表示,比如字元a,unicode code是0x0061,則ord('a')則返回97,因為十六進製制的61等於十進位制下的97
hex(xx): 就是把十進位制的數轉換成十六進製制串,比如hex(97)則變成 '0x61』. 這裡我們不需要前面的『0x',所以做切片[2:0]
最後拼接map返回的隨機元素列表後就是乙個隨機的字串了
在os.urandom(n)這一步可以產生255種字元,因為乙個字元的8位二進位制數是隨機分配的。由指定的n,則可以生成長度為n的,由255種隨機字元組成的字串。
lambda只是將我們生成的字串的每個字元轉換成我們可視的有數字和字母組成的長度為二的字串
hex把乙個8為的字元轉換成1個或2個字元,並且不會輸出類似0x0e這樣的串,因為它會輸出成0xe,所以最好做一次做一次切片
因為每個隨機字元最少會被轉換成1個字元,所以做切片不會遇到長度不夠長的情況,而且由於os.urandom(n)是在bit的級別上的隨機,應該保證了隨機性
python 隨機產生姓名
coding utf 8 importrandom list xing 趙 錢 孫 李 周 吳 鄭 王 馮 陳 褚 衛 蔣 沈 韓 楊 張 李 list ming 豫 章 故 郡 洪 都 新 府 星 分 翼 軫 地 接 衡 廬 襟 三 江 而 帶 五 湖 控 蠻 荊 而 引 甌 越 物 華 天 寶 ...
隨機產生數值(Python)
1 from random import randint 2from random import random 3from random import uniform 4from random import choice 5from random import randrange 6from ran...
Python 隨機數的產生
1 random.random 用於生成0 1的隨機浮點數 2 random.uniform a,b 用於生成乙個指定範圍內的隨機符點數,兩個引數其中乙個是上限,乙個是下限 3 random.randint a,b 生成指定範圍內的整數 4 random.randrange a,b,c a,b為範圍...