冬雪雪冬 发表于 2017-10-8 14:11:44

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

auyhin丶 发表于 2017-10-8 14:31:12

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='')

SixPy 发表于 2017-10-8 15:16:09

>>> import string, random
>>> s = (string.digits+string.ascii_uppercase).translate(''.maketrans('','','1I2Z5S0O'))
>>> ''.join(random.choice(s)for i in range(12))

bush牛 发表于 2017-10-8 18:42:13

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-8 21:13:06

本帖最后由 王天豹 于 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”。

solomonxian 发表于 2017-10-8 21:15:24

好像就是随机从范围内抽12个,也没有频率要求
import random

def fun():
    domain = '346789ABCDEFGHJKLMNPQRTUVWXY'
    return "".join(random.choice(domain) for _ in range(12))

堕落之翼 发表于 2017-10-8 21:23:46

import random

x = '346789ABCDEFGHJKLMNPQRTUVWSY'
s = ''
for i in range(12):
    s += random.choice(x)
print(s)

口可口可 发表于 2017-10-9 00:02:27

本帖最后由 口可口可 于 2017-10-9 00:38 编辑

简单粗暴的解法:
import random
list='346789ABCDEFGHJKLMNPQRTUVWXY'
print("生成的12位随机码为:",end='')
for each in range(12):
    print(random.choice(list),end='')


销赃1994 发表于 2017-10-9 00:15:47

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))

算是弄出来了,不过我想看看大神们的答案好改进一下。比如怎样生成自己想生成的随机数~~

wc365 发表于 2017-10-9 00:41:35

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:19:45

本帖最后由 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 09:25:43

本帖最后由 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())

BngThea 发表于 2017-10-9 09:33:09

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))

timeislife 发表于 2017-10-9 10:39:37

修改了一下:
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()
这样不会出错

Teagle 发表于 2017-10-9 11:39:35

import string,random
print(''.join(random.sample(,12)))

{:5_91:}{:5_91:}

胡先生 发表于 2017-10-9 12:28:42

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)

sige 发表于 2017-10-9 12:51:07

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:04:31

本帖最后由 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)

张大象 发表于 2017-10-9 15:23:26

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:47:42

本帖最后由 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)
页: [1] 2 3
查看完整版本: Python:每日一题 111