###GolfScript, 120 characters###
{10{rand}:R~!{[{.}{;}{Z\?[.(.10-@).10+]{Z=}%' '-.,R=}]'QWERTYUIOP ASDFGHJKL ZXCVBNM'' '22*11/*.{32|}%+:Z 2$?0>2+R=~}*}%
The code can be tested here.
{ # loop over all characters
10{rand}:R~! # take random number [0..9] and negate (i.e. 10% chance of true)
{ # {...}* is the if-block
[ # Three possible operations (code blocks) in the arry
{.} # a) duplicate
{;} # b) delete
{ # c) shift
Z # Z is the keyboard layout (see below)
\? # Find the index of the current letter
[.(.10-@).10+] # Calculate index of letter left, right, above, below
{Z=}% # Extract the corresponding letters for indices
' '- # Remove any spaces
.,R= # Take random item
}
]
# Z is the keyboard layout (upper and lower case)
# with enough spaces around
'QWERTYUIOP ASDFGHJKL ZXCVBNM'' '22*11/*.{32|}%+:Z
2$?0> # Is the current letter contained in Z and not a space?
2+ # Add 2 (i.e. 3 for letters, 2 for any other char)
R= # Take a random code block from above
~ # Execute the block
}*
}%