python中while循环中randrange()的空范围

2024-05-29 02:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在经历了一个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

这是使用函数的代码:

^{pr2}$

其中total_deck是来自文件的数组甲板.py在

这段代码在while循环的第一次迭代中运行良好,但是当循环迭代时,我得到错误:

 ValueError: empty range for randrange()

错误发生在

random.randrange(len(Maindeck) - 1) 

是因为

len(Maindeck) - 1 

现在计算结果是否等于或小于0?为什么会这样?在


Tags: 函数代码len错误randomsteps经历shuffle
2条回答

选项:

  • 如果列表中有一组卡,并且想重新排列整个序列,只需使用random.shuffle(sequence)进行内部洗牌。

  • 如果要获得一个洗牌副本,请使用random.sample()并将长度设置为序列的长度。


此行:

shuffler = maindeck

假定^{cd1>}是某种可变列表数据结构,^{{cd2>}引用了与^{{cd1>}相同的数据-您正在重新排列^{cd1>}(伪装)并返回它-然后进一步地,您正在对其进行编译。您可以使用^{cd5>}代替wich返回主甲板的洗牌副本。

^{cd6>}设置产生随机性的Mersenne_Twister的起始内部状态-如果需要,请设置一次,但每次洗牌时都设置一次。Seeding如果随机值固定,将导致相同的随机数,给定的u使用的随机操作与每个随机操作更改内部状态相同-不需要任何种子使用它,默认情况下,它在源中完成:请参阅Python's random: What happens if I don't use seed(someValue)?

您的代码应该使用^{cd8>}。


代码:

^{pr2}$

输出:

^{pr3}$

如果需要卡值,请使用:

^{pr4}$

啊!我看到问题了!您的游戏“用完”主牌堆,因为shuffling()函数将置换并返回原始牌堆:

shuffler = maindeck

主甲板的副本不会创建。因此

^{pr2}$

从主甲板上拿牌。在

修复:制作一个主甲板的深拷贝并使用它(在shuffling()):

import copy
...
shuffler = copy.deepcopy(maindeck)

等等!每场比赛都有全新的游戏装备。在

相关问题 更多 >

    热门问题