我正在编写一个乐透模拟器,其中代码为45个获胜号码和1000个玩家生成6个随机唯一数字,两者都存储为列表。
我想做的是计算每个分区的获胜者数量。
如果所有6个中奖号码等于玩家所拥有的6个号码,那么第1个分区,如果6个中奖号码中的任何5个等于玩家拥有的6个号码中的5个,则为第2个分区,如果6个中的任何4个,则为第3个分区中奖号码等于玩家拥有的6个号码中的4个,依此类推。
目前我的代码只查找第一个分区,并且不计算找到6/6的匹配(如果有)的次数。这是我遇到的问题我如何做到这一点同时还需要找到5 / 6,4 / 6,3 / 6的匹配。
我正在使用二进制搜索算法将中奖号码与玩家所拥有的数字进行比较。
winNum = [37, 10, 36, 26, 19, 43]
lotto = [[5, 19, 21, 24, 30, 38], [10, 11, 15, 24, 32, 34], ...]
# Calculates the total number of winners for each division.
def totalWinners():
target = winNum
search = binarySearch
i = 0
for i in range(len(lotto)):
found = search(target, lotto, 0, len(lotto)-1)
if found == -1:
print(lotto[i])
print("search unsuccessful...")
#Binary search algorithm.
def binarySearch (target, p, left, right):
l = left
r = right
while l <= r:
f = (l+r)//2
if target == p[f]:
return f
elif target < p[f]:
r = f - 1
else:
l = f + 1
return -1
感谢您的帮助。
答案 0 :(得分:0)
这对sets来说似乎更好。您可以免费轻松高效地计算交叉点。
winNumSet = set(winNum)
for entry in lotto:
division = len(set(entry) & winNumSet)
告诉你什么&#34;分裂&#34;该条目是以最合适的方式处理它。
显然,如果您可以控制winNum
的生成方式以及生成lotto
的元素,那么首先从集合开始会更有效。