¿Qué tan único es rand () en C?

Estoy usando rand() para un campo de 6 dígitos que necesita valores únicos. ¿Lo estoy haciendo bien?

¿Cuáles son las probabilidades, rand() me puede dar valores similares en llamadas consecutivas o frecuentes?

Fue único cuando usé rand (). Pero, devolví el mismo número cuando llamé a srand(time(NULL)) o a srand(clock()) . Parece, como si fuera opuesto a mí. ¿O es eso?

Como han señalado otros, la singularidad no está garantizada. Sin embargo, es probable que estés viendo números repetidos porque estás usando srand () y rand () incorrectamente.

srand () se utiliza para inicializar el generador de números aleatorios. eso significa que una serie de llamadas a rand () después de una llamada a srand producirá una serie particular de valores. Si llama a srand () con el mismo valor, entonces rand () producirá la misma serie de valores (para una implementación dada, no hay garantía entre las diferentes implementaciones)

 int main() { srand(100); for(int i = 0; i<5; ++i) printf("%d\n",rand()); printf("\nreset\n\n"); srand(100); for(int i = 0; i<5; ++i) printf("%d\n",rand()); } 

para mí esto produce:

 365 1216 5415 16704 24504 reset 365 1216 5415 16704 24504 

time () y clock () devuelven la hora, pero si los llama lo suficientemente rápido, entonces el valor devuelto será el mismo, por lo que obtendrá la misma serie de valores de rand ().

Además, rand () generalmente no es un generador de números aleatorios muy bueno y su uso generalmente significa que tiene que transformar la serie de números a la distribución que realmente necesita. Debería encontrar una fuente diferente de aleatoriedad y aprender las formas adecuadas para producir la distribución que desea o usar una biblioteca que pueda hacerlo por usted. (Por ejemplo, un método común para producir un número 'aleatorio' entre 0 y N es hacer rand() % N pero este no es realmente el mejor método.

C ++ proporciona una biblioteca de números aleatorios mucho mejor en . Proporciona diferentes algoritmos de PRNG, como linear_congruential, mersennne_twister, y posiblemente incluso un RNG criptográficamente seguro (dependiendo de la implementación). También proporciona objetos para producir una variedad de distribuciones, como uniform_int_distribution que debería evitar el error cometido en rand() % N

rand() devuelve valores entre 0 y RAND_MAX . Ya que es una distribución uniforme discreta, tiene una probabilidad de 1 / ( RAND_MAX +1) de repetir un número y, por lo tanto, la unicidad no está garantizada.

srand(seed) inicializa su generador de números aleatorios de modo que la secuencia de números obtenida de rand() sea ​​la misma cada vez que lo inicie con seed cada vez.

En su ejemplo, seed = time(NULL) que es el número de segundos transcurridos desde el 1 de enero de 1970, lo que garantiza una semilla diferente y, por lo tanto, una secuencia diferente de números aleatorios para cada llamada a srand(time(NULL)) (suponiendo que es No realizado dentro del mismo segundo).

Los números aleatorios son aleatorios , no únicos . Al igual que en una situación en la que se lanzan dados cuando puedes sacar varios seises seguidos, tu rand puede (y debería) a veces darte carreras de números idénticos.

Para asegurarse de que los números sean únicos, cree un conjunto donde registre cada uno de los números que ya ha agregado. Cuando aparezca un número aleatorio más de una vez, tire el segundo y vaya al siguiente.

¿Cuáles son las probabilidades, rand () me puede dar valores similares en llamadas consecutivas o frecuentes?

El algoritmo de rand no está especificado en C. Así es la calidad de la aleatoriedad de los números devueltos por rand .

introduzca la descripción de la imagen aquí