QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

版主

Rank: 20Rank: 20Rank: 20Rank: 20

技术值
查看: 1236|回复: 41

[技术交流] Python:每日一题 111

[复制链接]
最佳答案
503 
累计签到:731 天
连续签到:6 天
冬雪雪冬 发表于 2017-10-8 14:11:44 123641 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 冬雪雪冬 于 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

本帖被以下淘专辑推荐:

楼层
跳转到指定楼层
最佳答案
1 
累计签到:44 天
连续签到:1 天
auyhin丶 发表于 2017-10-8 14:31:12 | 显示全部楼层
  1. import random

  2. temp = []

  3. a = ord('A')

  4. for i in range(10):
  5.     if(i == 1 or i == 2 or i == 5 or i == 0):
  6.         continue
  7.     temp.append(i)

  8. for i in range(26):
  9.     asc = a + i
  10.     if(asc == ord('O') or asc == ord('I') or asc == ord('Z') or asc == ord('S')):
  11.         continue
  12.     temp.append(chr(asc))
  13. #print(temp)
  14. for j in range(12):
  15.     index = random.randint(0,len(temp)-1)
  16.     print(temp[index], end='')
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
232 
累计签到:249 天
连续签到:18 天
SixPy 发表于 2017-10-8 15:16:09 | 显示全部楼层
  1. >>> import string, random
  2. >>> s = (string.digits+string.ascii_uppercase).translate(''.maketrans('','','1I2Z5S0O'))
  3. >>> ''.join(random.choice(s)for i in range(12))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
11 
累计签到:10 天
连续签到:1 天
bush牛 发表于 2017-10-8 18:42:13 | 显示全部楼层
  1. from random import *

  2. # 直接从28个元素随机出来
  3. def f_one():
  4.     L = ['3','4','6','7','8','9',
  5.          'A','B','C','D','E','F',
  6.          'G','H','J','K','L','M',
  7.          'N','P','Q','R','T','U',
  8.          'V','W','X','Y']
  9.     return ''.join([x for x in choices(L, k=12)])
  10. print(f_one())

  11. # 随机unicode
  12. def f_two():
  13.     d = {79,73,83,53}
  14.     s = ''
  15.     for i in range(12):
  16.         a = choice([randint(51, 57), randint(65, 89)])
  17.         if a in d:
  18.             a += 1
  19.         s += chr(a)
  20.     return s
  21. print(f_two())
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
2 
累计签到:87 天
连续签到:1 天
王天豹 发表于 2017-10-8 21:13:06 | 显示全部楼层
本帖最后由 王天豹 于 2017-10-9 07:15 编辑
  1. import string
  2. import random
  3. l=[]
  4. a = string.ascii_uppercase
  5. b = string.digits
  6. for i in range(len(a)):
  7.         l.append(a[i])
  8. for i in range(len(b)):
  9.         l.append(b[i])
  10. for i in l:
  11.         if i == 'O' or i=='S' or i == 'I' or i == 'Z' or i == '0' or i == '1' or i == '2' or i == '5':
  12.                 l.remove(i)
  13. j=random.sample(l, 12)
  14. q=''.join(j)

  15. print(q)
复制代码


请教楼主,我这样写为什么不能去除“0”和“2”。
最佳答案
1 
累计签到:303 天
连续签到:28 天
solomonxian 发表于 2017-10-8 21:15:24 | 显示全部楼层
好像就是随机从范围内抽12个,也没有频率要求
  1. import random

  2. def fun():
  3.     domain = '346789ABCDEFGHJKLMNPQRTUVWXY'
  4.     return "".join(random.choice(domain) for _ in range(12))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
13 

尚未签到

堕落之翼 发表于 2017-10-8 21:23:46 | 显示全部楼层
  1. import random

  2. x = '346789ABCDEFGHJKLMNPQRTUVWSY'
  3. s = ''
  4. for i in range(12):
  5.     s += random.choice(x)
  6. print(s)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
累计签到:60 天
连续签到:1 天
口可口可 发表于 2017-10-9 00:02:27 | 显示全部楼层
本帖最后由 口可口可 于 2017-10-9 00:38 编辑

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



评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 

尚未签到

销赃1994 发表于 2017-10-9 00:15:47 | 显示全部楼层
def yanzhengma():
    import random
    m = random.randint(51, 89)
   
    while True:
        if m not in [53, 58, 59, 60, 61, 62, 63, 64, 73, 79, 83]:
            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))

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

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
累计签到:58 天
连续签到:1 天
wc365 发表于 2017-10-9 00:41:35 | 显示全部楼层
  1. import random
  2. a = list('ABCDEFGHIJKMNPQRTUVWXY346789')
  3. b = []
  4. for i in range(12):
  5.     index = random.randint(0,len(a)-1)
  6.     b.append(a[index])
  7. c = ''.join(b)
  8. print(c)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
56 
累计签到:356 天
连续签到:1 天
jerryxjr1220 发表于 2017-10-9 09:19:45 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-10-9 09:25 编辑

如果密码中的字符可重复用choices,如果不可重复可以用sample
  1. from random import choices
  2. print(''.join(choices('346789ABCDEFGHJKLMNPQRTUVWXY',k=12)))
复制代码

  1. from random import sample
  2. print(''.join(sample('346789ABCDEFGHJKLMNPQRTUVWXY',12)))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
15 
累计签到:225 天
连续签到:4 天
sunnychou 发表于 2017-10-9 09:25:43 | 显示全部楼层
本帖最后由 sunnychou 于 2017-10-9 10:11 编辑
  1. import random


  2. def rand():
  3.     a = []
  4.     for i in range(3, 10):
  5.         if i != 5:
  6.             a.append(i)
  7.     for i in range(65, 90):
  8.         if i != 73 and i != 79 and i != 83:

  9.             a.append(chr(i))
  10.     c = []
  11.     for i in range(0, 12):
  12.         d = random.randint(0, len(a)-1)
  13.         c.append(a[d])

  14.     # b = random.sample(a, 12)#生成无重复的12个数or生成又重复的12个数
  15.     return ''.join(str(i) for i in c)


  16. print(rand())
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
375 
累计签到:183 天
连续签到:32 天
BngThea 发表于 2017-10-9 09:33:09 | 显示全部楼层
  1. import random

  2. lista = [chr(i) for i in range(65,91)]
  3. lista.remove('S')
  4. lista.remove('Z')
  5. lista.remove('I')
  6. lista.remove('O')
  7. listn = [str(i) for i in range(3,10)]
  8. listn.remove('5')

  9. assemble = lista + listn

  10. verify = []
  11. for x in range(12):
  12.     verify.append(random.choice(assemble))
  13.    
  14. print(''.join(verify))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
3 
累计签到:51 天
连续签到:3 天
timeislife 发表于 2017-10-9 10:39:37 | 显示全部楼层
修改了一下:
  1. from random import randint
  2. def password():
  3.     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"]
  4.     list2 = []
  5.     i = 0
  6.     while i<12:
  7.         i+=1
  8.         list2.append(list1[randint(0,27)])
  9.     print(''.join(list2))
  10. while True:
  11.     j = 0
  12.     n = int(input("请输入次数:"))
  13.     while j<n:
  14.         j+=1
  15.         password()
复制代码

这样不会出错

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
38 
累计签到:69 天
连续签到:1 天
Teagle 发表于 2017-10-9 11:39:35 | 显示全部楼层
  1. import string,random
  2. print(''.join(random.sample([i for i in string.ascii_uppercase+string.digits if i not in "0125OISZ"],12)))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 

尚未签到

胡先生 发表于 2017-10-9 12:28:42 | 显示全部楼层
import random

strs = ''
i=1
while  i < 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' or  Letter == 'I' or  Letter == 'S' or  Letter == 'Z':
                        continue
                else:
                        strs = strs + Letter
                        i = i +1

print (strs)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
累计签到:37 天
连续签到:1 天
sige 发表于 2017-10-9 12:51:07 | 显示全部楼层
  1. import random
  2. list_num = [i for i in range(3,10)]
  3. list_alp = [chr(i) for i in range(65,91)]
  4. list_tot = list_num + list_alp

  5. for i in [5,'O','I','S','Z']:
  6.         list_tot.remove(i)

  7. result = ''
  8. for i in range(12):
  9.     n = random.randint(0,27)
  10.     result = result + str(list_tot[n])
复制代码

运行结果:
M6BVA7GLT7FU
7FQF3UM7FJHG
LPMTTG9FURQ7

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
9 
累计签到:279 天
连续签到:4 天
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[char_index]

print(iden_code)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 

尚未签到

张大象 发表于 2017-10-9 15:23:26 | 显示全部楼层
  1. import random
  2. L = [i for i in range(51,91) if i in range(51,58) or i in range(65,91)]
  3. for i in(53,79,73,90,83):
  4.     L.remove(i)
  5. M = []
  6. for i in range(0,12):
  7.     s = random.randint(0,28)
  8.     M.append(chr(L[s]))
  9. print(''.join(M))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 

尚未签到

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荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-12-19 00:39

快速回复 返回顶部 返回列表