Partimos de una función existente RandUnsigned que devuelve un valor aleatorio [0, MAX_UNSIGNED_INT]. Tenemos que el valor devuelto ocupa 4 bytes. Si lo que queremos es una función que devuelva valores booleanos aleatorios, lo que no debemos hacer es lo siguiente:
// return random true/false
bool RandomBool(){
// above midvalue
if (RandUnsigned() & 0xFFFF0000)
return false;
else
return true;
}
¿Que probabilidad hay de que estén en el mismo estado dos bits cualesquiera? Pues aplicando un poco de matemática básicas, p = 0,5 * 0,5 = 0,25 = 0.5^2. Para que la función devuelva true se tiene que cumplir que los 16 bits más significativos estén a cero (por lo de la comparación con 0xFFFF0000), y la probabilidad de que esto ocurra es de p = 0.5^16 = 0,000015 aprox. Resumiendo, una probabilidad ínfima de obtener el valor true.
Y por esto opino que la función ni siquiera se probo. Por que si se hubiese probado, se habría obtenido pocas veces o ninguna el valor true.
Mi solución
// return random true/false
bool RandomBool(){
const unsigned int MID_VALUE = 1<<(UINT_BITS - 1);
// above midvalue
return (RandUnsigned() < MID_VALUE);
}
Otra opción hubiese sido simplemente comprobar si un bit cualquiera del número aleatorio es uno o cero. Dependiendo de la máquina en la que se compile puede que se ganen unos pocos ticks de ejecución. Lo que es seguro es que las dos soluciones tenderán a dar los valores false y true con la misma probabilidad, 50% para cada uno, lo que es una gran ventaja respecto a la función original.