網(wǎng)上參考的一個(gè)生成兌換碼函數(shù)
# encoding=utf8
import random
import string
def _int_to_str(x, base=36):
"""Reversed version of int(s, base=?). src: http://stackoverflow.com/questions/2267362/"""
numerals = string.digits + string.lowercase + string.uppercase
numerals.replace('0','')
numerals.replace('o','')
if x == 0:
return numerals[0]
sign = -1 if x < 0 else 1
x *= sign
digits = []
while x:
digits.append(numerals[x % base])
x /= base
if sign < 0:
digits.append(u'-')
return u''.join(reversed(digits))
n_codes = 10 # 生成兌換碼個(gè)數(shù)
rand_len = 6 #這里可以隨意傳入想要生成的位數(shù)
rand_limit = 36 ** rand_len
prefix = 'TX'
for x in xrange(0,n_codes):
rand = _int_to_str(random.randrange(0, rand_limit), base=36).zfill(6)
code_text = prefix + rand
print code_text
這里使用了一個(gè)_int_to_str的方法 傳入的x則是0-36的n次方中間的任意一個(gè)數(shù)炸客,然后 base為36. 下面為整個(gè)函數(shù)的解析
下面_int_to_str函數(shù) 使用了一個(gè) string模塊 然后將0-9a-zA-Z包含到了一個(gè)叫numerals的變量之中低零。
如果x==0 那么返回0
sign等于 如果x<0 sign等于-1 否則等于1 這一句判斷傳入的x是否為一個(gè)負(fù)數(shù)。并且取出其符號(hào) 從這一句可以看到 這個(gè)通用函數(shù) 其實(shí)并不是 前面這個(gè)作者自己寫的。而是一個(gè)通用使用方法。用于解析指定base多少位數(shù)使用。 這里后面再討論。
如果為負(fù)數(shù) 轉(zhuǎn)為正數(shù)
申明一個(gè)digits = []
digits追加(numerals[傳入x % base])
x/=base 這里注意了這里和上面式子呼應(yīng) 一個(gè)取的是余數(shù) 處以36取到的余數(shù)一定是0-36之間的數(shù)苞氮,然后可以轉(zhuǎn)換為string,而這里記錄每次除以之后剩余的值
由于取的是36的n次方 這里也正好可以除n次瓤逼,這樣的話 就對(duì)應(yīng)了生成多少個(gè)隨機(jī)數(shù)了笼吟。然后跳出循環(huán)之后 判斷符號(hào) 是否需要追加 負(fù)號(hào) 也就是 還原負(fù)號(hào)
最后再將數(shù)組重新拼接成字符串返回
由此結(jié)束這樣拆開來看 似乎還是比較清晰 合理的。后面再使用了一個(gè) zfill()函數(shù) 不滿這個(gè)數(shù)就往前用0補(bǔ)齊抛姑。 這樣看來 的確也有夠隨機(jī) 而且 base參數(shù)實(shí)際上是可變化的赞厕。這個(gè)算法 蠻有意思 所以在這里 記錄一下。與大家分享定硝。
原文地址:http://www.cnblogs.com/piperck/p/5047378.html