网上参考的一个生成兑换码函数
# 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 # 生成兑换码个数
rand_len = 6 #这里可以随意传入想要生成的位数
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
这里使用了一个_int_to_str的方法 传入的x则是0-36的n次方中间的任意一个数,然后 base为36. 下面为整个函数的解析
-
下面_int_to_str函数 使用了一个 string模块 然后将0-9a-zA-Z包含到了一个叫numerals的变量之中。
-
如果x==0 那么返回0
-
sign等于 如果x<0 sign等于-1 否则等于1 这一句判断传入的x是否为一个负数。并且取出其符号 从这一句可以看到 这个通用函数 其实并不是 前面这个作者自己写的。而是一个通用使用方法。用于解析指定base多少位数使用。 这里后面再讨论。
-
如果为负数 转为正数
-
申明一个digits = []
-
digits追加(numerals[传入x % base])
-
x/=base 这里注意了这里和上面式子呼应 一个取的是余数 处以36取到的余数一定是0-36之间的数,然后可以转换为string,而这里记录每次除以之后剩余的值
由于取的是36的n次方 这里也正好可以除n次,这样的话 就对应了生成多少个随机数了。 -
然后跳出循环之后 判断符号 是否需要追加 负号 也就是 还原负号
-
最后再将数组重新拼接成字符串返回
由此结束这样拆开来看 似乎还是比较清晰 合理的。后面再使用了一个 zfill()函数 不满这个数就往前用0补齐。 这样看来 的确也有够随机 而且 base参数实际上是可变化的。这个算法 蛮有意思 所以在这里 记录一下。与大家分享。
原文地址:http://www.cnblogs.com/piperck/p/5047378.html
网友评论