1

私がやろうとしているのは、それぞれが手順である文字のリストを持っていることです。次に、このリストからランダムに(または疑似ランダムに、それは問題ではありません)選択し、その手順を実行します。それを再度実行できるようにするには、同じ値を取得しないようにします。たとえば、5 つの値がある場合、5 回実行できるようにしたい場合、6 回目に実行すると何も返されません。コードは次のとおりです。

from Tkinter import*
from random import randint
Characters=[Percy,Annabeth,Leo,Chuck,Sarah]
Used = []
def callback():
    end = len(Characters)-1
    rando = randint(0,end)
    Characters[rando]
    for i in Characters:
         if Characters[rando] in Used:
            print 'This has already been used'
         else:
            Characters[rando]()
            Used.append(Characters[rando])
            break


game = Tk()
game.geometry('50x50+700+100')
Button1 = Button(game,text = '1',command =lambda:callback() )
Button1.pack(side=LEFT)


game.mainloop() 

取得しようとしています

callback()

正しく実行するために、私はあなたが見ているものを試しましたが、私も試しました

if Characters[rando] in Used:
    print 'This has already been used'
else: 
   Characters[rando]
   Used.append(Characters[rando])

どちらの場合も、同じプロシージャが複数回実行されます。たとえば、'Leo' は 3 回続けて実行される可能性があります。これを行う方法を何時間も探しましたが、見つかりませんでした。

4

2 に答える 2

7

まず、次のことをshuffle行いCharactersます。

Characters = [Percy,Annabeth,Leo,Chuck,Sarah]
random.shuffle(Characters)

コールバックを実行すると、次popの 1 文字が削除されます。

def callback():
    try:
       C = Characters.pop()  #popping the last one is more efficient than the first.
    except IndexError:
       return None

    return C()

これは を破壊するCharactersため、必要に応じてリセットするためにコピーを保持しておくことをお勧めします:

 random.shuffle(Characters)
 Characters_save = Characters[:]

 def reset_characters():
     Characters[:] = Characters_save[:]
于 2012-10-22T18:45:42.640 に答える
0

完全にテストされていませんが、基本的なクラスを実装できます:

from random import shuffle

class CallNext(object):
    def __init__(self, vals):
        self.vals = vals[:]
        shuffle(self.vals)
        self.iter = iter(self.vals)
    def __call__(self):
        try:
            next(self.iter)()
        except StopIteration as e:
            pass # or do something smarter?

キャッチする代わりの別のオプションは、StopIteration次を使用することです。

next(self.iter, lambda: None)()

そして、持っています:

Button1 = Button(game, text='1', command=CallNext(Characters) )
于 2012-10-22T19:10:59.553 に答える