Итак ... Вам нужен метод, который делает случайное перемешивание 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)
Как и вы, я вызвал функцию 'recursively' - вызов функции внутри функции - с условием прерывания.
Таким образом, вам не нужно использовать глобальную переменную - в большинстве случаев использование глобальной переменной не очень хорошая идея.
И, по поводу вашего вопроса (Как я могу сделатьпередал значение в глобальную переменную), вы можете сделать что-то вроде этого.
a = 0
def foo(m):
global a
a = m
#and your code here...