我有一张特定值的卡片列表,从0.5,1-2 ...... 7开始。
我需要每次循环从列表中选择一个随机卡并尽可能多地执行值的总和,但总和不得超过sum < 7.5
,每次我必须从卡中弹出卡列表。
我试过这种方式:
(切换器是一个查找卡片值并将其合计为sum
)
while sum < 7.5:
card_picked = cards[random.randrange(len(cards))]
sum = switcher(card, sum)
card_index = cards.index(card)
cards.pop(card_index)
但是这每次都给我一个大于7.5的值。 有什么想法吗?
答案 0 :(得分:1)
您正在添加sum
(顺便说一下,最好重命名,因为你的内置函数sum()
的名称已经盖过了),然后然后,下次你点击循环的顶部,你正在检查它是否超过了限制。因此,当且仅当已经已经过去时,您才会退出循环。所以你总是会在sum > 7.5
的状态下退出循环。您可以重新制定while
条件,以便在知道新卡值之后,但在更新sum
之前对其进行评估。或者您可以保持原样但跟踪最后添加的卡片:然后,一旦您在圈外,从sum
中减去其值并将卡片放回到卡片组中。
答案 1 :(得分:1)
不是一次挑选一张卡片,而是可以简单地随机播放所有卡片,并始终pop()
第一张卡片 - 这样会更好,然后选择一张随机的卡片并在以后获取索引:
import random
cards = [.5,1,2,3,4,5,6,7]
# shuffle the whole cards list into a new random configuration
pickings = random.sample(cards,k=len(cards))
s = 0
c = []
while True: # they eventually add up to more then 7.5 so no need to check for empty list
card = pickings.pop(0) # get first
if s + card < 7.5: # can add?
s += card # do so
c.append(card) # and to list so we see the cards collected
else:
print("cant take ", card) # cant, break while
break
print ("Sum:",s)
print(c)
一些运行:
cant take 4
Sum: 3.5
[3, 0.5]
cant take 3
Sum: 5
[4, 1]
cant take 7
Sum: 2.5
[0.5, 2]