Fuente: http://c-faq.com/lib/randrange.html
La forma obvia
rand()%N
- ¿Puedo colaborar con R y Python en la misma página web?
- ¿Cuál es el mejor libro para aprender algoritmos y estructuras de datos en Java para principiantes?
- ¿Existen algoritmos que puedan determinar la convergencia o la falta de ella para cualquier serie arbitraria que se pueda expresar en notación de suma estándar?
- ¿Está roto el algoritmo de clasificación de Java y Python?
- Si uno se está preparando para una entrevista en Google (y tiene 6 meses en la mano), ¿qué libro lo beneficiará más y por qué? ¿'Introducción a los algoritmos' (CLRS) o 'Algoritmos desbloqueados'?
(que intenta devolver números del 0 al N-1) es pobre, porque los bits de orden inferior de muchos generadores de números aleatorios son angustiosamente no aleatorios. (Ver http://c-faq.com/lib/notveryrand….)
Un método mejor es algo como
(int)((double)rand() / ((double)RAND_MAX + 1) * N)
Si prefiere no usar coma flotante, otro método es
rand() / (RAND_MAX / N + 1)
Obviamente, estos métodos requieren conocer RAND_MAX (que ANSI define en ), y asumir que N es mucho menor que RAND_MAX.
Si está comenzando con un generador de números aleatorios que devuelve valores de punto flotante entre 0 y 1, todo lo que tiene que hacer para obtener enteros de 0 a N-1 es multiplicar la salida de ese generador por N:
(int)(drand48() * N)
Referir:
- http://stackoverflow.com/a/6852396
- Código C – 35 líneas – teclado
- Guía C – 2.13 stdlib.h
- Guía C – 2.13 stdlib.h