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)
これはアルゴリズムではないため、おそらくあなたが望むものではありません。配列からソングを取得し、別の配列にintを格納し、新しいランダムintがarrrayにあるかどうか、そして新しいランダムintを取得するかどうかをチェックするだけでランダムintを使うことができます。 – Maantje
私はあなたが言語ライブラリを使用するだけでなく、あなた自身でこのようなアルゴリズムを考案しようとしていると思いますか?後者をしたいのであれば、Pythonには既にrandom.shuffle()があります。私はあなたが便利に先を見ることができるように、インプレースの並べ替えを行うことが理想的だと思います。 –
あまりにも複雑に見えます。 n個の曲がリストにある場合、[0 .. n-1]の間に乱数を生成しないでください。 – Henry