2016-10-10 7 views
1

ランダムな順序で関数を実行したい。変数リストをシャッフルする "シャッフル"機能のように見えます。関数をランダムな順序で実行する方法は?

入力:

def a(): 
    print('a') 

def b(): 
    print('b') 

def c(): 
    print('c') 

shuffle([a,b,c]) 

これは私が何をしたい出力されます。

a 
b 
c 

または

a 
c 
b 

または

c 
b 
a 

など ランダムな順序で関数を実行するにはどうすればよいですか?

+1

「ランダムインポートシャッフル」...あなたが実際にそこにいるように見えます。 –

+0

まだコードを書こうとしましたか?それも投稿してください。私は、キーが整数であり、値が関数参照である辞書を作って、ランダムな整数を使って辞書内の関数を調べることを考えています。 – Brian

答えて

5

random.shuffleは、インプレース操作です。だからあなたは別にリストを保持し、それをシャッフルする必要があります。

functions = [a, b, c] 
shuffle(functions) 

さて、機能がシャッフルされ、あなただけの彼らに

for func in functions: 
    func() 

を実行する必要がありますが、おそらく機能でこれを保存し、この

def run_functions_in_random_order(*funcs): 
    functions = list(funcs) 
    shuffle(functions) 
    for func in functions: 
     func() 

run_functions_in_random_order(a, b, c) 

ようにそれを行うことができます

また、次の関数を使用することもできます。ここで

import random 

def a(): 
    print('a') 

def b(): 
    print('b') 

def c(): 
    print('c') 

my_list = [a, b, c] 
random.choice(my_list)() 
1

またはリストを作成し、ランダムに取るように閉鎖、。基本的にはthefourtheyeが提案しています。 Run this Code

from random import shuffle 

def a(): 
    print('a') 

def b(): 
    print('b') 

def c(): 
    print('c') 

def main(): 
    lis = [a,b,c] 

    shuffle(lis) 

    for i in lis: 
     i() 
+0

ループ内では、同じ関数を複数回呼び出すことができます(\ *)。 (\ *)各自が連続して3回だけ呼び出される機会は実際には小さすぎる(私が正しい場合は9のうち2つ)、それを "可能"と呼ぶには小さすぎる。 – usr2564301

1

は私がどうなるかである。この

def run_functions_in_random_order(*funcs): 
    def run(): 
     functions = list(funcs) 
     shuffle(functions) 
     for func in functions: 
      func() 
    return run 

random_exec = run_functions_in_random_order(a, b, c) 

random_exec() 
random_exec() 
random_exec() 
関連する問題