Is the choice of mixins chosen randomly or chosen according to size, date of transaction, or otherwise?
Currently, it's chosen randomly. Half the fake outputs are chosen over the whole chain, and half over the last 1.8 days. In both cases, a triangular distribution is used over the possible fake outputs based on their order of appearance on the blockchain. See wallet2::get_outs in src/wallet/wallet2.cpp.
There is a patch on Github to switch to a single set, using a gamma distribution over the possible fake outputs' age, as found to be close to the real usage distribution in a paper from Miller et al. See https://github.com/monero-project/monero/pull/3528