The reason is I've been through a lot of interviews that consisted simply of a few questions like "open a connection to an SQL database in C++". Now, what's the answer to that? Perhaps "Okay, right after you tell me what library you're using and give me its API." or maybe "Do you really expect a good developer to remember functions they used just once? If you coded opening connections to databases more than a couple times per project, you're very likely doing something wrong."
I'm not very good with people, but I've still got a proposal for every interview with no test or a decent one, but nothing fruitful ever came from interviews with demented tests.
I think the best tests come from interesting questions that will catch the horrible people on the spot, and give the good people opportunity to shine, like "What's the difference of ++x and x++ in C?". An average person might say "they're different in when x will be incremented", but better people can answer in more details, maybe even including details on how it used to make performance differences in for loops, but doesn't anymore, and why that is so.
On a higher (but still technical) level, you probably just want to know who likes to know the technologies that are important to them in depth. With that in mind, I think it's a lot more useful to ask "Tell me about a detail of your language of choice you think I don't know about/that surprised you in your work." than telling somebody to create a very small program in an hour or to solve a bug in a program they've never seen.
Of course, that is considering you want good programmers to work on a mid-sized or even larger project. If you just want some guys to program for your sweatshop, my honest advice is you hire average skilled, unambitious people, or people who have been a few years at other sweatshops.