Python:每日一题 111
本帖最后由 冬雪雪冬 于 2017-10-11 20:09 编辑首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 为了让大家独立思考,跟帖改为“回帖仅作者可见”。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。
题目:
生活中常常遇到激活码或邀请码,一般由数字和字母组成,题目要求生成由0~9和大写字母A~Z组成的12位随机码,为了避免混淆,这里去掉了数字0和字母O,数字1和字母I,数字2和字母Z,数字5和字母S,也就是用36-8=28个字符组成随机的代码,例如:
Q34E774RADFF
import random
temp = []
a = ord('A')
for i in range(10):
if(i == 1 or i == 2 or i == 5 or i == 0):
continue
temp.append(i)
for i in range(26):
asc = a + i
if(asc == ord('O') or asc == ord('I') or asc == ord('Z') or asc == ord('S')):
continue
temp.append(chr(asc))
#print(temp)
for j in range(12):
index = random.randint(0,len(temp)-1)
print(temp, end='')
>>> import string, random
>>> s = (string.digits+string.ascii_uppercase).translate(''.maketrans('','','1I2Z5S0O'))
>>> ''.join(random.choice(s)for i in range(12)) from random import *
# 直接从28个元素随机出来
def f_one():
L = ['3','4','6','7','8','9',
'A','B','C','D','E','F',
'G','H','J','K','L','M',
'N','P','Q','R','T','U',
'V','W','X','Y']
return ''.join()
print(f_one())
# 随机unicode
def f_two():
d = {79,73,83,53}
s = ''
for i in range(12):
a = choice()
if a in d:
a += 1
s += chr(a)
return s
print(f_two()) 本帖最后由 王天豹 于 2017-10-9 07:15 编辑
import string
import random
l=[]
a = string.ascii_uppercase
b = string.digits
for i in range(len(a)):
l.append(a)
for i in range(len(b)):
l.append(b)
for i in l:
if i == 'O' or i=='S' or i == 'I' or i == 'Z' or i == '0' or i == '1' or i == '2' or i == '5':
l.remove(i)
j=random.sample(l, 12)
q=''.join(j)
print(q)
请教楼主,我这样写为什么不能去除“0”和“2”。 好像就是随机从范围内抽12个,也没有频率要求
import random
def fun():
domain = '346789ABCDEFGHJKLMNPQRTUVWXY'
return "".join(random.choice(domain) for _ in range(12)) import random
x = '346789ABCDEFGHJKLMNPQRTUVWSY'
s = ''
for i in range(12):
s += random.choice(x)
print(s) 本帖最后由 口可口可 于 2017-10-9 00:38 编辑
简单粗暴的解法:
import random
list='346789ABCDEFGHJKLMNPQRTUVWXY'
print("生成的12位随机码为:",end='')
for each in range(12):
print(random.choice(list),end='')
def yanzhengma():
import random
m = random.randint(51, 89)
while True:
if m not in :
break
m = random.randint(51, 89)
return m
names = locals()
for i in range(12):
names['x%s' % i] = yanzhengma()
print("%c%c%c%c%c%c%c%c%c%c%c%c" % (x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11))
算是弄出来了,不过我想看看大神们的答案好改进一下。比如怎样生成自己想生成的随机数~~ import random
a = list('ABCDEFGHIJKMNPQRTUVWXY346789')
b = []
for i in range(12):
index = random.randint(0,len(a)-1)
b.append(a)
c = ''.join(b)
print(c) 本帖最后由 jerryxjr1220 于 2017-10-9 09:25 编辑
如果密码中的字符可重复用choices,如果不可重复可以用sample
from random import choices
print(''.join(choices('346789ABCDEFGHJKLMNPQRTUVWXY',k=12)))
from random import sample
print(''.join(sample('346789ABCDEFGHJKLMNPQRTUVWXY',12))) 本帖最后由 sunnychou 于 2017-10-9 10:11 编辑
import random
def rand():
a = []
for i in range(3, 10):
if i != 5:
a.append(i)
for i in range(65, 90):
if i != 73 and i != 79 and i != 83:
a.append(chr(i))
c = []
for i in range(0, 12):
d = random.randint(0, len(a)-1)
c.append(a)
# b = random.sample(a, 12)#生成无重复的12个数or生成又重复的12个数
return ''.join(str(i) for i in c)
print(rand())
import random
lista =
lista.remove('S')
lista.remove('Z')
lista.remove('I')
lista.remove('O')
listn =
listn.remove('5')
assemble = lista + listn
verify = []
for x in range(12):
verify.append(random.choice(assemble))
print(''.join(verify))
修改了一下:
from random import randint
def password():
list1 = ["3","4","6","7","8","9","A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","T","U","V","W","X","Y","Z"]
list2 = []
i = 0
while i<12:
i+=1
list2.append(list1)
print(''.join(list2))
while True:
j = 0
n = int(input("请输入次数:"))
while j<n:
j+=1
password()
这样不会出错 import string,random
print(''.join(random.sample(,12)))
{:5_91:}{:5_91:} import random
strs = ''
i=1
whilei < 13:
now_second = random.randint(1,2)
num = str(random.randint(4,9)) #数字
Letter_num= random.randint(97, 122)
Letters=str(chr(Letter_num)) #字母
Letter = Letters.upper()
if now_second%2 == 0:
if num == 5:
continue
else:
strs = strs + num
i = i +1
else:
if Letter == 'O' orLetter == 'I' orLetter == 'S' orLetter == 'Z':
continue
else:
strs = strs + Letter
i = i +1
print (strs) import random
list_num =
list_alp =
list_tot = list_num + list_alp
for i in :
list_tot.remove(i)
result = ''
for i in range(12):
n = random.randint(0,27)
result = result + str(list_tot)
运行结果:
M6BVA7GLT7FU
7FQF3UM7FJHG
LPMTTG9FURQ7 本帖最后由 xindong 于 2017-10-9 13:26 编辑
# -*- coding: utf-8 -*-
import random
char_list='346789ABCDEFGHIJKMNPQRTUVWXY'
iden_code=''
for i in range(0,12):
char_index=random.randint(0,27)
iden_code=iden_code +char_list
print(iden_code)
import random
L =
for i in(53,79,73,90,83):
L.remove(i)
M = []
for i in range(0,12):
s = random.randint(0,28)
M.append(chr(L))
print(''.join(M)) 本帖最后由 qwc3000 于 2017-10-9 15:52 编辑
import random
# 是字母进入此子程序
def isLetter():
# 随机产生一个65--89的数字
litter=random.randint(65, 89)
# 判断是不是 79 83是重置
while litter==79 or litter==83 :
litter = random.randint(65, 89)
# 将此数对应ASCII码中的字符 返回
return chr(litter)
#是数字进入此子程序
def isNum():
num=random.randint(49, 57)
while num==50 or num==53 :
num = random.randint(49, 57)
return chr(num)
# 定义一个邀请码的字符串
Invitation_code=""
# 定义个变量 随机置数0,1用来判断当前位置是字母还是数字
tmp=random.randint(0,1)
# 循环12次生成邀请码
for i in range(1,13):
if tmp==1:
Invitation_code+=isNum()
else:
Invitation_code+=isLetter()
tmp=random.randint(0,1)
print(Invitation_code)