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.