Estoy interesado en C++, aunque sospecho que simplemente importa la definición estándar de C. Creo que la respuesta es no a lo que dice el estándar, pero estoy más interesado en la respuesta práctica.¿El valor de RAND_MAX siempre es (2^n) -1?
Si RAND_MAX es siempre (2^n) -1, eso simplifica el tratamiento de un problema que apareció recientemente moviendo el código de MinGW GCC a Linux GCC. RAND_MAX parece ser más grande (no lo compruebo, pero posiblemente igual a INT_MAX o lo que sea que el símbolo sea), así que un viejo código ingenuamente escrito RAND_MAX no es lo suficientemente grande como para funcionar con el contratiempo. Ahora necesito decidir qué tan general necesito que sea esta biblioteca, teniendo en cuenta la dificultad del código de escritura que hace frente correctamente a la posibilidad de desbordamiento sin hacer suposiciones sobre, por ejemplo, el ancho de un int.
De todos modos, ¿hay algún compilador de C++ razonablemente utilizado que use algo distinto de (2^n) -1 para RAND_MAX?
Además, estoy en lo cierto ((RAND_MAX | (RAND_MAX >> 1)) == RAND_MAX) siempre y solo es verdadero si RAND_MAX es igual a ((2^n) -1) para un entero sin signo n. Creo que RAND_MAX es técnicamente un int, pero no tiene sentido tener un valor negativo o fraccionario, por lo que creo que puedo descartarlos con seguridad. Normalmente, no me molesta manipular los bits, pero sigo pensando que la expresión parece incorrecta, y no puedo entender por qué.
Finalmente, aunque no voy a estar contento hasta que tenga una solución de trabajo propia, ¿qué debería usar para números aleatorios en lugar de escribirlo yo mismo? Necesito números aleatorios en el rango 0 < = x < parámetro, y especialmente quiero las mismas probabilidades posibles para todos los números. Por ejemplo, tomar (rand()% upperbound) da un sesgo hacia valores más pequeños, especialmente cuando el límite superior es grande; quiero evitar eso.
¿Hay algo de Boost o C++ 0x para eso?
EDITAR
Tras algo en el bit "relacionada" en el lado de la página aparecen en efecto, hay una manera de obtener números aleatorios con dados límites inferior y superior de impulso.
Ya tengo una implementación de Twister de Mersenne, no es una buena razón, solo estaba cubierta en un libro. Una buena versión de la biblioteca sería más práctica, por supuesto. Gracias por los consejos. – Steve314
Cambiaría a Boost si fuera tú; separa limpiamente el PRNG de las distribuciones de probabilidad e incluye una clase 'random_device' para el correcto sembrado (http://www.boost.org/doc/libs/release/doc/html/boost/random_device.html). –
Se acepta aproximadamente el 80% debido al concepto erróneo sobre el enlace del rand: el punto de Boost es más práctico, pero ese enlace es muy interesante. – Steve314