If it is just random pick I'm thinking to have two wallets running. One to accept payment and leave there, another to send payments. Once in a while swap their functions.
it's not random. It's designed to maximize coin age and reduce inputs.
Where did this meme originate? It's not true. The official client will use coins with more than 6 confirmations if it can, but other than that makes no effort to use old coins. It tries to find the set of coins which has the smallest value above the value you're trying to send, which usually results in a small 'change' output being left in your wallet, which can tend to increase future fees.
The idea of using two wallets is a reasonable one and should work. Bear in mind that to avoid fees, each coin you spend should be at least one "bitcoin day" old. i.e. multiply the coin's value in BTC by its age in days, and it that's more than about one then you can probably spend it for free. That's just a rough rule of thumb, because the number of outputs also affects the transaction size, but only about 20% as much as the number of outputs does. (Each input adds 179-181 bytes to the transaction size, while each input only adds 34 bytes).
Alternatively, if you feel comfortable building the client from source, you can modify it so that it prefers older coins. Find the bit in wallet.cpp that says:
return (SelectCoinsMinConf(nTargetValue, 1, 6, setCoinsRet, nValueRet) ||
SelectCoinsMinConf(nTargetValue, 1, 1, setCoinsRet, nValueRet) ||
SelectCoinsMinConf(nTargetValue, 0, 1, setCoinsRet, nValueRet));
and add a few more lines, so it tries the oldest coins first. Something like this would work:
return (SelectCoinsMinConf(nTargetValue, 1, 6*24*30, setCoinsRet, nValueRet) || // try just using 30 day old coins first
SelectCoinsMinConf(nTargetValue, 1, 6*24*7, setCoinsRet, nValueRet) || // then 7 day old
SelectCoinsMinConf(nTargetValue, 1, 6*24, setCoinsRet, nValueRet) || // then 1 day old
SelectCoinsMinConf(nTargetValue, 1, 6, setCoinsRet, nValueRet) || // then 1 hour old
SelectCoinsMinConf(nTargetValue, 1, 1, setCoinsRet, nValueRet) ||
SelectCoinsMinConf(nTargetValue, 0, 1, setCoinsRet, nValueRet));
Depending how 'micro' your coins are, and how old your wallet is, you might want to go further still, but I'm sure you get the point.