题目为:
可以使用一个循环来明白前述彩票大奖有多难中奖。为此,创建一个名为 my_ticket 的列表或元组,再编写一个循环,不断地随机选择数或者字母,直到中大奖为止。请打印一条消息,报告执行循环多少次才中了大奖。
个人的思路为:两个列表A和B,A装着所有可以中奖的字符,B装着自己选的若干字符,然后从A中选出同B内元素个数一致的字符出来(比如自己先选6个字符放进B里,然后也在A里随机选6个字符出来),装进C里,将B与C排序后进行比较,不相同则计数变量+1,继续循环;若相同则中奖,最后输出循环的次数。
自己的”奖券”里可以含有相同的字符,也不考虑字符的顺序排列。
先导入两个模块:
from random import choice
import operator
choice负责随机选择列表中的元素,operator中的方法eq负责比较两个列表是否完全一致。
然后创建中奖字符列表和自选字符列表:
elements = ['1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f']
# 彩票中所有中奖字符
my_ticket = ['7','3','9','1','9','b']
# 我选择的字符
进而开始创建循环:
length = len(my_ticket)
# 选好的中奖字符个数
range_len = length + 1
active = True
times = 1
# 计数变量
bingo_string = ''
while active:
bingo = []
for i in range(1,range_len):
bingo.append(choice(elements))
# 将随机选出的中奖字符存入一个新的列表里
ifequal = operator.eq(sorted(bingo),sorted(my_ticket))
# 排序后,比较两个列表是否相同
if ifequal:
# 相同之后 ifequal 为 True
active = False
print(f"第{times}次,中奖了.")
for i in bingo:
bingo_string += f"{i} "
print(f"中奖字符为: {bingo_string.rstrip()}")
else:
print(f"第{times}次,没中奖.")
# 这里选择输出每一次没中奖时已经循环的次数,也可以不这样做。
times += 1
最后就会得到结果:
--snip--
第37980次,没中奖.
第37981次,没中奖.
第37982次,没中奖.
第37983次,中奖了.
中奖字符为: 1 9 7 9 b 3
[Finished in 724ms]
每次的结果都不一样。
这样可以得到单次博彩的结果。
也可以通过 input 手动输入自己想买的彩券上的字符,再套一层 while 并在中奖之后执行的代码下增加询问是否继续博彩。
如果 my_tickets 中含有相同的字符,则循环的次数会多很多…
比如只选了四个1:
循环次数都是相当多的…
由于 choice() 会有几率选择同一个元素,如果想要不重复的取出元素需要使用 numpy.random.choice() 。
多多少少还是增加了一些正经的知识…