There is a very interesting article on the matter on Gamasutra: Intelligent Mistakes: How to Incorporate Stupidity Into Your AI Code, by Mick West.
This article talks about a Pool game AI. When implementing such an AI, it's quite easy to make it pot a ball at each shoot. A simplistic way to make the AI less "smart" is, as suggested on other answers, to add a random factor to the calculation, making the AI miss more.
But there is two major flaws with such an approach. First, it's unpredictable. For a player playing in "Easy" mode, it's unacceptable that the AI gets "lucky". What if your random factor makes the AI do an even better shot, hitting a more valuable ball, or doing a combo? You don't know what is going to happen, and being lucky shouldn't be an option for the AI on an easy mode.
The other flaw is that the player will try to identify a pattern in the AI behaviors. And with a simple random factor, there is no pattern. But that doesn't mean the player won't see any pattern, quite the opposite, in fact. As soon as the AI gets lucky, the player will see a strategy in its behavior. In the article, the players are complaining about the AI playing a position strategy. When there's just a random factor in the angular precision.
From my point of view, after reading this eye-opening article, a non-perfect AI should never use randomization as a simplification factor. It's quite the opposite. An easier AI should be smarter, but trying to help the player.
In the article Pool game example, the best option for implementing an "easy mode" AI was in fact to remove all random factor, and to add a positioning strategy. The AI would try to hit balls in order to prepare an easy and awesome shot for the player.
This way, the player will think he got lucky. And that's what you're expecting for a game when playing it easy.