Why isn't iTunes shuffle random?
This is a problem that has bugged me for the last 5 years, across multiple devices, operating systems and installs of iTunes and iPods.
I have found that the iTunes shuffle feature does not randomly shuffle songs. In fact, I can accurately predict the exact sequence of songs that iTunes will play. This frustrates me to no end because I like to listen to my music randomly, but I have a few favourite songs that I always start out with.
For example, if I select the song 'Somebody That I Used To Know' by Gotye, it will always follow with this exact sequence of songs:
- Blame It On The Tetons by Modest Mouse
- Girl You Have No Faith In Medicine by The White Stripes
- Mombassa by Hans Zimmer, from the Inception Soundtrack
- Break of Dawn by Michael Jackson
- Missing Words by Mark Ronson and the Business International
The method I use to start the songs does not matter. I have tried selecting the song in iTunes, searching for it and playing it with Coversutra, or searching for it from within iTunes, playing the song and then clearing the search. All three methods will play the exact same sequence of songs.
I thought this might be due to the same seed being used, but I get the same sequence after restarting iTunes or even my computer. The sequence is the same across different days as well. Waiting for the song to finish or hitting next does not change anything either.
I have had this problem (but with different sequences) for as long as I can remember on my Windows PC, MacBook and my iMac. All different versions of iTunes and operating systems, spanning 5 years.
Why does iTunes fail so hard and something that is so easy? Is there any way I can fix this?
The Summary Version
It is random, but the order is only shuffled once, when you turn random play on. If you want to re-shuffle the order, turn random play off and then on again.
The Detailed Version
I don't think this is a bug, it's a feature. Though I can understand how it might seem broken.
iTunes doesn't shuffle the order of the tracks every time you hit play (or any other control button). Another way of saying this is: it uses the same seed for your playlist every time until you tell it to use another seed.
This may seem contrary to the idea of shuffle but it actually serves a purpose: it lets the skip back and skip forward buttons work in a manner that makes sense. I can move back 5 songs while it's on shuffle to hear the song I heard 5 songs ago, and then iTunes plays through all the songs I just heard to get me back to the spot I was at before going back 5 songs.
I do believe the ordering is truly random the first time it's generated. The problem is it's never obvious how to re-generate the ordering after that so your brain, which is really good at recognizing patterns as that's a handy survival skill when you're hunting and gathering, starts to learn the order over time. It starts to find patterns.
You can see this is the case with this little experiment. Set iTunes to shuffle your entire library. Pick a track. Play 5 tracks and write them down. Now pick any other track and let iTunes play one or two songs after that. Now go back to your first track and play from there again. It'll play that track and the same five after it that you wrote down. Changing tracks didn't reseed the random number generator.
The traversal through your tracks is truly random, but that random order isn't refreshed often enough so it starts to feel non-random.
So how do you get iTunes to generate a new shuffle order?
You uncheck and recheck the shuffle button. Doing this causes iTunes to recreate the random traversal path through your playlist (or entire library). It re-seeds the random number generator.
You can convince yourself this is true with a little experiment. Take an album that has track numbers in the meta data and select tracks 1 through 5 then select File -> New Playlist from Selection... from the menu. You'll now have a playlist with 5 songs in it.
Select that playlist and make sure that the shuffle button is unlit and that the track numbers are showing in the window. iTunes will show you the tracks in order: 1, 2, 3, 4, 5.
Now hit the shuffle button.
iTunes will show you the tracks out of order. I get: 4, 2, 1, 3, 5.
Now hit the shuffle button to turn it off. And turn it on again.
I now get: 5, 2, 3, 4, 1.
Repeat as many times and needed to convince yourself that iTunes is actually regenerating a random traversal sequence through the tracks in your playlist.
It's the same thing for traversing your entire library: if you never uncheck and recheck the shuffle button the order never gets regenerated so things will start to seem non-random. After I unchecked and rechecked shuffle and began playing my entire library from my original starting track from my second paragraph above I got 5 different songs after it this time. So the order was changed, it's just less obvious when you're looking at your entire library instead of a playlist.
There's a caveat to all of this: iTunes DJ (aka Party Shuffle) works differently. With Party Shuffle you can influence the selection so that there's weighting given to more popular songs in your library. This obviously isn't random playback. So if you want truly random playback you want to shuffle your entire library from the Music view in the sidebar, not the iTunes DJ view. And you want to uncheck and re-check that shuffle button before each listening session to keep it truly unpredictable.
Another reason why iTunes does only generate the randomness once is that this way it can ensure that you get every track played once with no duplicates.
If you have 1000 tracks in shuffle mode, after 1000 plays you will have listened to all of them. That would never work if it would randomly choose a track every time you hit play or the previous track ended, you would get duplicates at some point.
I remember reading somewhere that apple originally used true randomness in shuffle but people complained that the same song would play two or three times in a row (which you would expect as an almost certainty considering the number of users). They quickly changed it and Steve Jobs spun it (rather well) into "iPods are now less random in order to seem random" when he released the feature.
So shuffle was changed to randomising the track list every time you selected it rather than randomising the next song - to remove the risk of double, triple, quadruple etc. plays.
I just feel sorry for the guy who copped the same song 5 times in a row despite having 1000s of songs in his iPod. Surely there was at least one...
@Bombe and @IanC - there are reversible pseudorandom number generators, so you do only need one number, not the whole sequence. Think about it, the time taken to generate the sequence does not depend on the size of your music collection. Encryption algorithms offer one approach, since any encryption algorithm that does not change the length of the input (eg the Enigma Machine, Caesar Ciphers) will give you random-ish values that you can treat as a number, and you can decrypt any string to reverse through the sequence.
However, it's far simpler just to use a simple linear congruential generator, of the form:
If the constants are chosen such that every value less than m will be generated, it turns out there are a different set of constants a', c' that reverse the sequence. You (or Apple) only need to calculate the second set of constants once. One pair of generators that are inverses of each other are:
See here for the derivation. You then pick a starting value using your system clock, and hey presto - a reversible random sequence.
All that's then needed is a way to map numbers in the range [0, 232-1] to songs in your collection, which is pretty simple.
If shuffle really works by playing the songs in the same order every time though, (as the questioner describes) then Apple are not maintaining a random number independent of the current song - since multiple numbers in the range 0..232-1 would map to the same song with different subsequent songs. Instead, they must be using the song's position in your collection as xn, and then mapping from xn+1 back to a song position. This would mean you'd get exactly the effect described in the question. The only variation would be the starting point, which would be a mapping from the clock to xn, then calculating xn+1 and mapping that back to a song position.