As far as simulations go: Try messing around with fuzzy logic.
From Wikipedia:
"Fuzzy logic is a form of many-valued logic in which the truth values of variables may be any real number between 0 and 1. It is employed to handle the concept of partial truth, where the truth value may range between completely true and completely false."
Add a bit of randomness & I guarantee you won't get the same results from a program every time. Include a learning algorithm & it's liable to end up at least as unpredictable as me at my most chaotic.