题目为:
可以使用一个循环来明白前述彩票大奖有多难中奖。为此,创建一个名为 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() 。
多多少少还是增加了一些正经的知识…