2015-01-11 113 views
0

我正在做Chris Pine的'學會編程'。第11章的練習要求創建一個洗牌播放列表。下面是我寫的:y <count&y <= count的區別

def shuffle songs 
    playlist = [] 
    x = 0 
    y = 0 
    count = songs.length 

    while y <= count 
    x = rand(count) 
    if songs[x] != 'used' 
     playlist.push songs[x] 
     songs[x] = 'used' 
     y= y + 1 
    end 
    end 
    filename = '/Users/M/Music/shuffled_playlist8.m3u' 
    File.open filename, 'w' do |s| 
    s.puts playlist 
    end 
end 
song_name = Dir['/Users/M/Music/*.{MP3,mp3}'] 
shuffle song_name 

在1n7棕櫚油,當我把<=代替<,程序不會退出。它可能與方法rand有關,該方法不包含隨機數,或者數組的範圍從0開始。有人可以指出什麼導致程序不退出?

+0

之間有什麼「小於」和「小於或等於」不同? – user2864740

回答

1

由於您在0處開始'y',並在每次找到新的未使用歌曲時增加它(隨後將其標記爲已使用),因此'y'可以獲得的最大值爲'count'。

所以while循環會一直持續下去,因爲它始終滿足< ='count'條件。

使用<比較是實現您要在此處執行操作的正確方法,因爲一旦'y == count',您已經創建了包含原始數組中每首歌曲的播放列表一次。

+0

明白了!謝謝 :) –

0

y將始終小於或等於count並永遠不會大於count的值。這是因爲你從y = 0開始,當所有歌曲都被使用時,你的y就等於count

例如,如果只有一首歌曲,那首歌曲將用於第一個循環,
您的y = 1和您的count = 1
之後y永遠不會增加。所以你的循環將永遠不會結束,如果你的條件是y <= count

你會循環不必要的次數與隨機循環使用這種方法。一種更好的方法是動態地減少給rand()x,並從列表中刪除使用的歌曲,以便重複相同的條件不會再次發生。

def shuffle songs 
    playlist = [] 

    while songs.length > 0 
    x = rand(songs.length) 
    playlist.push songs[x] 
    songs.delete_at(x) 
    end 
    playlist 
end 
song_name = ("a".."e").to_a 
shuffle song_name # => ["d", "c", "a", "b", "e"] 

或在單行中,使用內置shuffle功能

song_name = ("a".."e").to_a 
song_name.shuffle # => ["e", "c", "b", "a", "d"] 
相關問題