Il tuo codice non ha l'uso esclusivo della CPU, e anche se non sono in esecuzione altri programmi "esigenti" ci sono comunque tutti i vari demoni in esecuzione, così come il resto del sistema operativo, che rubano ogni tanto qualche punto percentuale di CPU per poter operare, in maniera in linea di massima non deterministica. Inoltre, sempre per motivi connessi al fatto che il tuo programma non è l'unico codice che sta andando in questo momento, da esecuzione ad esecuzione avrai cache miss o page faults in momenti diversi, il che causa discrepanze tra un'esecuzione e l'altra. Se poi inizi ad usare il disco o la rete butti dentro un'enormità di fattori più o meno casuali (latenza di rete, posizione delle testine del disco, posizione angolare del piatto, situazione delle varie cache, ...).

In sintesi: se vuoi un'esecuzione che sia ogni volta perfettamente identica devi usare un sistema operativo realtime (a dirla tutta i sistemi operativi "normali" multitasking preemptive sotto certi aspetti possono essere forzati a darti tutta la CPU finché non la rilasci, ma comunque non è sufficiente), o avere il completo controllo di cosa sta andando sulla CPU (=il tuo software è il solo codice attualmente in esecuzione, accade solitamente con i microcontrollori) e non dipendere in nulla da input esterni che possono introdurre fattori di casualità.