2016-04-11 6 views
1

この問題を解決する最善の方法を知りたい:すべてのソングが再生されるまで、ソングのリストからソングをランダムに再生しないでください。ランダムソングの演奏アルゴリズム

私のアルゴリズムでは、基本的にget_randomを減らした音楽セットを呼び出し、再生する次の曲を見つけます。 get_randomは2の累乗を使用してリストを分割し、さらに細分します。

これは私がやることができる最善の方法ですか、それとも他にも優れたアルゴリズムがありますか?私はちょうどアイデアが必要です。

import random 
import math 

def get_random(number): 
     if number == 0: 
      return number 
     if number == 1: 
      return number 
     #make the number power of 2 
     orig_no = number 
     number = 1 << (math.floor(math.log(number))+1) 
     left = 0 
     right = number 
    # check if toss falls in this current half and then change the half for next recursion. 
    # we change half from 1, 2, 4, 8, 16, 36, 64, 128 
     while left < right: 
      #f1 can be replaced by this rd.randint(0, 1) 
      toss_value = f1() 
      if toss_value: 
       right = math.floor((left + right)/2) 
      else: 
       left = math.floor((left + right)/2) + 1 
     if left >= orig_no: 
      return get_random(orig_no) 
     else: 
      return left 

songs = ["i am here", "your are beautiful", "soorry", "i am happy", "where am i", "what did i do", "nothing wrong with you"] 
for i in range(0, len(songs)-1): 
     value = get_random(len(songs)) 
     print(songs[value]) 
     songs.pop(value) 
+0

これはアルゴリズムではないため、おそらくあなたが望むものではありません。配列からソングを取得し、別の配列にintを格納し、新しいランダムintがarrrayにあるかどうか、そして新しいランダムintを取得するかどうかをチェックするだけでランダムintを使うことができます。 – Maantje

+1

私はあなたが言語ライブラリを使用するだけでなく、あなた自身でこのようなアルゴリズムを考案しようとしていると思いますか?後者をしたいのであれば、Pythonには既にrandom.shuffle()があります。私はあなたが便利に先を見ることができるように、インプレースの並べ替えを行うことが理想的だと思います。 –

+0

あまりにも複雑に見えます。 n個の曲がリストにある場合、[0 .. n-1]の間に乱数を生成しないでください。 – Henry

答えて

3

あなたは、配列をシャッフルするFisher–Yates shuffleを使用することができます

...、曲の配列をシャッフルすべての曲を再生し、再びそれをシャッフルします。 Pythonを使用しているので、既にrandom.shuffleがあります。

関連する問題