我正在编写一个程序,可以对给定的序列(列表l)进行m次打乱。我的函数接受列表l和数字m作为输入,但Ive为一个随机播放定义了随机播放本身,然后使用for循环将其执行了m次。但是,现在for循环不采用用户分配的值m。
我是Python菜鸟,所以很可能我错过了一件简单的事情。香港专业教育学院试图使用全局m,以(重新)定义我的职能,但我不知道如何做到这一点,或者它似乎不起作用。
def riffle_shuffle(l, global m):
#global m goes here?
r = np.random.binomial(len(l),0.5)
sd1 = l[:r]
d2 = l[r:]
fl = []
c = [sd2,sd1]
l2 = sd2+sd1
for i in range(1,len(l) + 1):
x = [sd2,sd1]
y = [(len(sd2))/(len(l) - i+1),(len(sd1))/(len(l) - i+1)]
a = choices(x,y)
a1 = a[0][0]
fl.append(a1)
#Deck Split is c
#Sub decks are',c
#Probabilities are',y
#Deck chosen is',a
#fl
if a1 in sd1:
sd1.remove(a1)
elif a1 in sd2:
sd2.remove(a1)
return fl,m
for j in range(1,m+1):
fl = riffle_shuffle(fl)
return fl
我遇到了错误,说未定义m,语法无效,出现以下错误消息。我不知道这最后一个意味着什么。
“在比较中超过了最大递归深度”
非常感谢您的帮助!
编辑:我错过了描述中提到的for循环。现在到了抱歉。
答案 0 :(得分:0)
所以...你想用浅浅的方法洗几次m,对吧?
您的代码存在一些问题:
首先,return
在函数之外。
第二,在不破坏条件的情况下在函数中调用函数:因此,函数将调用该函数,然后将再次调用该函数,依此类推,直到发生错误为止。那就是maximum recursion depth exceeded in comparison
。
第三,您已经像这样使用np.random.choice
:np.random.choice(x, p=y)
。否则,python不知道y是概率,它将解释为第二个参数:输出的大小。所以这里发生错误。
这可能是您要编写的代码:
import numpy as np
def riffle_shuffle(l, m):
if m == 0:
return l
else:
fl = []
r = np.random.binomial(len(l), 0.5)
sd1 = l[:r]
sd2 = l[r:]
c = [sd2,sd1]
l2 = sd2+sd1
for i in range(1,len(l) + 1):
x = [sd2,sd1]
y = [(len(sd2))/(len(l) - i+1), (len(sd1))/(len(l) - i+1)]
a = np.random.choice(2, p=y)
a = x[a]
a1 = a[0]
fl.append(a1)
#Deck Split is c
#Sub decks are',c
#Probabilities are',y
#Deck chosen is',a
#fl
if a1 in sd1:
sd1.remove(a1)
elif a1 in sd2:
sd2.remove(a1)
fl = riffle_shuffle(fl, m - 1)
return fl
a = riffle_shuffle([1, 2, 3, 4, 5, 6, 7, 8], 3)
print(a)
#output : [5, 6, 1, 7, 4, 8, 2, 3] (can be changed)
就像您一样,我以递归方式调用了函数-调用函数中具有中断条件的函数。
通过这种方式,您不必使用全局变量-在大多数情况下使用全局变量并不是一个好主意。
然后,关于您的问题(如何使用户提供的值成为全局变量),您可以执行类似的操作。
a = 0
def foo(m):
global a
a = m
#and your code here...