Objetivo C: Sesgo del módulo

Utilizando

value = arc4random() % x 

¿Cómo puedo evitar o eliminar el sesgo de módulo?

Gracias a todos.

Por cierto, al menos de acuerdo con Wikipedia, el sesgo del módulo es un problema cuando se progtwign juegos de azar.

arc4random devuelve un entero sin signo de 32 bits (0 a 2 32 -1).

Probablemente no habrá un sesgo de módulo notable para una x suficientemente pequeña. Sin embargo, si quieres estar realmente seguro, haz esto:

y = 2 p donde 2 p-1 p

 val = arc4random() % y; while(val >= x) val = arc4random() % y; 

Use arc4random_uniform(x) . Esto lo hace por ti.

De acuerdo con la página man:

arc4random_uniform() devolverá un número aleatorio distribuido uniformemente menos que upper_bound . arc4random_uniform() se recomienda sobre construcciones como arc4random() % upper_bound ya que evita el “sesgo de módulo” cuando el límite superior no es una potencia de dos.

 u_int32_t maxValue = ~((u_int32_t) 0); // equal to 0xffff... maxValue -= maxValue % x; // make maxValue a multiple of x while((value = arc4random()) >= maxValue) { // loop until we get 0 ≤ value < maxValue } value %= x; 

aunque a menos que uses cualquier x por debajo de un millón (o más) no me preocuparía

Si el valor máximo de arc4random mod x es mayor que x , ignore cualquier valor mayor que el mayor arc4random-max mod x , llamando a arc4random nuevamente.

 u_int32_t maxValue = ~((u_int32_t) 0); // equal to 0xffff... maxValue -= maxValue % x; // make maxValue a multiple of x while((value = arc4random()) >= maxValue) { // loop until we get 0 ≤ value < maxValue } value %= x; 

Objeción un tanto pedante a la respuesta de cobbal. "Funciona", es decir, elimina el sesgo del módulo, pero rechaza más valores de los necesarios. El caso más extremo es x = 2 ^ 31. Todos los valores de arc4random () deberían aceptarse aquí, pero el código tal como está escrito rechazará la mitad de ellos.

En su lugar, agregue 1 a la inicialización de maxValue (que lo pone en 2 ^ 32 por lo que tendrá que usar un int de 64 bits), y luego es correcto. También puede evitar el uso de un int de 64 bits. Pruebe de antemano si 2 ^ 32% x == 0, si es así, todos los valores de arc4random () son aceptables y puede omitir el bucle; de ​​lo contrario, puede mantener maxValue en 32 bits restando 2 ^ 32% x en la inicialización.

Usa el método a continuación. Evita el “sesgo de módulo” y es rápido en el iphone. Ahorre algunos ciclos de CPU.

SI quieres 4-7:

 (random() / (float)RAND_MAX )*3+4 

O si quieres 0-8

 (random() / (float)RAND_MAX )+8