Cómo generar números aleatorios + análisis detallado del principio

Hablando de cómo generar un número aleatorio, es posible que vea un fragmento de código después de Baidu.

srand((unsigned int)time(NULL));
int ret = rand();

Entonces, ¿cómo se genera exactamente un número aleatorio? Creo que los que son buenos explorando deben querer conocer los principios de esto, así que no digamos mucho, ¡vayamos al tema!
Cómo se genera un número aleatorio:
cuando se trata de generar números aleatorios, todos sabemos que necesitamos usar una función rand, entonces, ¿cómo se usa esta función? Podemos abrir MSDN para ver cómo se usa esta función
Inserte la descripción de la imagen aquí
. La primera oración aquí dice Cuando la función rand devuelve un número entero de 0 a RAND_MAX, ¿cuál es el valor de RAND_MAX? Podemos copiarlo en el compilador y seleccionarlo, hacer clic derecho y hacer clic con el mouse para ir a la definición, puede ver que la oración
Inserte la descripción de la imagen aquí
es en realidad, el valor de RAND_MAX también es 0x7fff, que se convierte a decimal, que es 32767, por lo que la función rand puede generar aleatoriamente un número entero de 0 a 32767. Cuando lo intente en el compilador, verá
Inserte la descripción de la imagen aquí
cuando cree ingenuamente que tiene exitoso Cuando pueda generar números aleatorios, encontrará que cuando ejecute el código nuevamente ese año, generará estos números aleatorios, es decir, el código genera números aleatorios la primera vez que se ejecuta el código, pero el mismo se genera la la segunda vez se ejecuta un número aleatorio.
En este momento, debemos recordar que hay una segunda oración en la descripción de la función rand: Antes de llamar a la función rand, tenemos que usar la función srand para establecer el punto de partida para generar números aleatorios. Busquemos la función srand en MSDN:
Inserte la descripción de la imagen aquí
podemos ver que el parámetro de la función srand es un entero sin signo y no tiene valor de retorno. Entonces podemos probarlo, simplemente pasar un entero sin signo a la función srand
Inserte la descripción de la imagen aquí
Pero cuando ejecutamos el programa de nuevo, estos números aleatorios siguen siendo los mismos. Cuando cambiamos la función srand entrante, encontramos que el número aleatorio dado ha cambiado:
Inserte la descripción de la imagen aquí
por lo que solo necesitamos pasar una y a la función srand cada vez que se ejecuta el programa. Un número diferente la última vez, pero solo queremos generar un número aleatorio, y ahora necesitamos un número aleatorio nuevamente. ¿No es este un ciclo sin fin?
En este momento, pensamos que hay algo en la computadora que está cambiando todo el tiempo, y ese es el tiempo. En este momento, necesitamos introducir un concepto, es decir, la marca de tiempo.
Marca de tiempo: la diferencia entre la hora actual y la hora de inicio de la computadora, en segundos.
La hora de inicio de la computadora: 1970-01-01 08:00:00
Inserte la descripción de la imagen aquí
La marca de tiempo es diferente cada segundo, por lo que solo necesitamos pasar la marca de tiempo a la función srand, luego necesitamos usar la función de tiempo, porque El valor de retorno de la función de tiempo es la marca de tiempo.
Inserte la descripción de la imagen aquí
Aquí podemos ver que el parámetro de la función time es un puntero de tipo time_t, y el valor de retorno es de tipo time_t. También podemos poner time_t en el compilador haciendo clic con el botón derecho del ratón y haciendo clic para ir a la definición:
Inserte la descripción de la imagen aquí
aquí podemos ver que en realidad time_t El tipo int es redefinido por typedef (es decir, tiene un alias).
Y no necesitamos pasar ningún puntero a la función de tiempo, por lo que podemos pasar un puntero nulo (NULL) a la función de tiempo, es decir, tiempo (NULL), pero el parámetro de la función srand es un unsigned tipo int, por lo que si para pasar el valor de retorno de tiempo de la función srand función, entonces necesitamos devolver el valor de tiempo de la conversión obligatoria funcionará tipo int sin signo, es decir, (unsigned int) time (NULL)escribimos el código final es:
Inserte la descripción de la imagen aquí
entonces, lo que obtienes cada vez que ejecutas el código es un número aleatorio real.
Cómo generar un número aleatorio con un número específico de dígitos:
Genere un número aleatorio de dos dígitos:
Inserte la descripción de la imagen aquí
Solo necesitamos tomar el resto del número aleatorio 90, luego el número que obtenemos es el número 0-89, y luego sumar 10 es 10-99 Los números están arriba.
Genere tres números aleatorios: La
Inserte la descripción de la imagen aquí
razón es la misma que la de generar dos números aleatorios, no daré más detalles.

En cuanto al MSDN utilizado en el artículo, si no tiene uno, puede buscar en http://www.cplusplus.com. También puede ver información sobre funciones relacionadas.

Supongo que te gusta

Origin blog.csdn.net/chenlong_cxy/article/details/112862909
Recomendado
Clasificación