¿Cuál es la mejor manera de restringir los valores de un PRNG a un rango menor? Si usa el módulo y el número máximo anterior no es divisible de manera uniforme por el nuevo número máximo, se polariza hacia 0
hasta (old_max - new_max - 1)
. Asumo la mejor manera sería algo como esto (este punto está flotando, no matemáticas número entero)¿Cuál es el método adecuado para restringir un número pseudoaleatorio a un rango menor?
random_num = PRNG()/max_orginal_range * max_smaller_range
pero algo en mi interior me hace cuestionar que el método (tal vez flotando diferencias de implementación punto y representación?).
El generador de números aleatorios producirá resultados consistentes en todas las plataformas de hardware y software, y la restricción también lo necesita.
Tenía razón para dudar del pseudocódigo anterior (pero no por las razones que estaba pensando). El answer de MichaelGG me hizo pensar sobre el problema de otra manera. Puedo modelarlo usando números más pequeños y probar cada resultado. Entonces, supongamos que tenemos un PRNG que produce un número aleatorio entre 0 y 31 y desea que el rango más pequeño sea de 0 a 9. Si usa el módulo, se inclina hacia 0, 1, 2 y 3. Si usa el pseudocódigo por encima de usted predispone a 0, 2, 5 y 7. No creo que pueda haber una buena forma de asignar un conjunto al otro. Lo mejor que he logrado hasta ahora es regenerar los números aleatorios que son mayores que old_max/new_max
, pero eso también tiene problemas profundos (reduciendo el período, el tiempo para generar nuevos números hasta que uno esté en el rango correcto, etc.) .
Creo que ingenuamente he abordado este problema. Puede ser hora de comenzar una investigación seria sobre la literatura (alguien tiene que haber abordado esto antes).
También puede echar un vistazo a java.util.Random.nextInt (int) que utiliza un método bastante inteligente para restringir el resultado sin introducir un sesgo. Me tomó alrededor de un día para entender por qué funciona, aunque :) – Joey
¿Dónde está disponible esa fuente? (Lo siento, no soy un codificador de Java, no sé nada sobre dónde está la API) – DevinB
La verificación aleatoria no es una buena idea, pero si reduzco los números a algo manejable puedo probar cada resultado (ver arriba), y el pseudocódigo es de hecho parcial. Ahora tengo que ir a buscar artículos que es poco probable que comprenda, suspiro. –