【发布时间】:2019-04-07 21:38:54
【问题描述】:
我在通过 while 循环后从函数中获取随机 int 时遇到问题。该函数的目的是洗牌:
def shuffling(maindeck, shuffle_steps):
random.seed()
# sets a number of steps and creates a new array to be returned
steps = 0
shuffler = maindeck
while steps < shuffle_steps:
firstR = random.randrange(len(maindeck) - 1)
secondR = random.randrange(len(maindeck) - 1)
shuffler[firstR], shuffler[secondR] = shuffler[secondR], shuffler[firstR]
steps +=1
return shuffler
这是使用该函数的代码:
from deck import *
from shuffle import shuffling
gameState = True
while gameState:
input("Welcome to War! Press any key to continue... \n")
game_deck = shuffling(total_deck, 500)
while gameState and len(game_deck) > 1:
print("Both players draw a card...")
playerCard = game_deck.pop(0)
opponentCard = game_deck.pop(0)
# some code
keep_playing = input("Play again? (y/n) \n")
if keep_playing is not ('y' or 'Y'):
gameState = False
gameState = False
if len(game_deck) < 2:
print("No cards left!")
keepPlaying = input("Play again? (y/n) \n")
if keepPlaying is ('y' or 'Y'):
gameState = True
total_deck 是来自文件deck.py 的数组
这段代码在 while 循环的第一次迭代中运行良好,但是当循环迭代时出现错误:
ValueError: empty range for randrange()
而且那个错误发生的时候
random.randrange(len(Maindeck) - 1)
被调用,因为
len(Maindeck) - 1
现在求值为等于或小于 0 的数字?为什么是这样?
【问题讨论】:
-
您的洗牌算法不是统一洗牌。无论如何,除此之外,您可以使用
random.shuffle(maindeck)代替您自己的洗牌功能。 -
你注意到牌组的最后一张牌永远不会被洗牌吗?那是因为
random.randrange(n)永远不会返回n(甚至在文档中也这么说)。所以你应该把-1放到random.randrange(len(maindeck)-1)中。 -
@SilverSlash 关于non-uniform shuffle (maths details) 是正确的。还 +1 指向标准库。
标签: python python-3.x