6. Genere números aleatorios y juegos de adivinar números (función rand, función srand, función de tiempo)

1. Generar números aleatorios

1.1 función rand

El prototipo de función es el siguiente:

int rand(nulo);

Archivo de encabezado requerido: stdlib.h

Función: devuelve uno aleatoriamente después de llamarnúmero pseudoaleatorio, el rango de números aleatorios está entre 0~RAND_MAX, que es 32767 en la mayoría de los compiladores (la función rand se abre con Ctrl+botón izquierdo del mouse y se define como: #define RAND_MAX 0x7fff )

Número pseudoaleatorio: la razón por la que es un número pseudoaleatorio es que la función rand() genera números aleatorios basados ​​en un valor de referencia llamado "semilla" .
Acerca de la semilla: el valor base de la semilla predeterminado en la función rand es 1
, por lo que debe usar la función srand() (mencionada más adelante) para inicializar el valor base de la semilla.

Ejemplo:

#include <stdio.h>
#include <stdlib.h>
int main() {
    
    
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

Llamé a la función rand tres veces aquí y los resultados son los siguientes:
41
18467
6334
Luego volví a ejecutar el programa muchas veces y el número aleatorio no cambió. Siempre han sido estos números. Esto
es lo que se llama aquí. .número pseudoaleatorio, por lo que el cambio real del número aleatorio se logra llamando a la función srand() para cambiar la **semilla**

1.2 función principal

El prototipo de función es el siguiente:

void srand(unsigned int seed);
El parámetro en srand() es una semilla entera no negativa
. Esta semilla entera no negativa es la llamada semilla, que determina el número aleatorio devuelto por la función rand().

Función: inicializa el generador de números aleatorios.
La esencia de la función: es decir, la semilla en srand (semilla int sin signo) debe ser aleatoria, y solo la función rand () puede generar un número verdaderamente aleatorio.

Pregunta: ¿Suena esto contradictorio?
rand() requiere que semilla sea un valor aleatorio al generar números aleatorios.
Cuando srand(seed) define semilla, también necesita un valor aleatorio. El número aleatorio de rand aún no se ha generado, entonces, ¿de dónde viene el número aleatorio?

Solución: siempre que el valor inicial cambie todo el tiempo, puede hacer que rand llame a la función de manera diferente cada vez,
por lo que deberá usar la función time() a continuación.

1.3 función de tiempo

Motivo: utilice la hora en la que se ejecuta el programa como valor inicial de la semilla, porque la hora cambia todo el tiempo.

El prototipo de función es el siguiente:

tiempo_t tiempo(tiempo_t * temporizador);

Archivo de encabezado requerido: time.h

Función: cuando el parámetro de la función time() es NULL , devuelve el valor actualMarca de tiempo; Si el temporizador es un puntero no NULL, la función colocará la marca de tiempo en la memoria a la que apunta el temporizador y la devolverá.

Marca de tiempo: es decir, la diferencia de tiempo entre las 0:00:00 del 1 de enero de 1970 y la ejecución actual del programa. La unidad es segundos. El tipo de
retorno es time_t, que es esencialmente largo (entero largo de 32 bits) o largo largo (entero largo de 64 bits)

Ejemplo: generar números aleatorios

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    
    
	//time()函数 参数为NULL时,返回当前时间戳,作为种子
	//因为srand函数的参数时unsigned int类型,所以将time函数的返回值类型强制转换
	unsigned int seed = (unsigned int)time(NULL);
	//初始化seed
	srand(seed);
	//调用rand() 并打印随机数
	printf("调用随机值(整型):%d\n", rand());
	return 0;
} 

Resultado: a medida que cambia el tiempo, los números aleatorios generados son diferentes cada vez.
Nota: ¡La función srand solo necesita llamarse una vez en un programa y no es necesario llamarla repetidamente!

1.4 Establecer el rango de números aleatorios

Por ejemplo: queremos generar números aleatorios entre 0 y 99, el método es el siguiente

 rand() % 100;//余数的范围为0~99

Principio:
El rango del valor de retorno de rand() es 0-32767. En términos de dígitos, el rango es [10,000 ~ unidades].
% 100 = los dos últimos dígitos de este número. Ejemplo: 32699 % 100 = 99 32600 % 100 = 0
Número en el nivel de dígitos de miles % 100 = Ejemplo de los dos últimos dígitos de este número: 3299 % 100 = 99 3200 % 100 = 0 Número
en el nivel de dígitos de centenas % 100 = Ejemplo de los dos últimos dígitos de este número: 199 % 100 = 99 100 % 100 = 0
, números de nivel de decenas % 100 = el número en sí Ejemplo: 99 % 100 = 99 0 % 100 = 0

Según la conclusión anterior, para generar un número aleatorio entre 1 y 100, el método es el siguiente

 rand() % 100 + 1;//余数的范围为1~100



Para generar un número aleatorio entre 100 y 200, el método es el siguiente

 100 + rand() % (200 - 100 + 1);//余数的范围为0~100,加100后就是100~200

Resumen: si desea generar números aleatorios entre ab, el método es el siguiente

a + rand() % (b - a + 1);

2. Juego de adivinar los números

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game() {
    
    
	int num = rand() % 100 + 1;//生成随机数(范围1-100)
	int guess = 0;//初始化 输入猜的数字
	int count = 5;//设置挑战次数

	while (count)
	{
    
    
		printf("你还有%d次机会,请输入你猜的数字:",count);
		scanf("%d", &guess);
		
		if (guess < num)
		{
    
    
			printf("猜小了\n");
			
		}
		else if (guess > num)
		{
    
    
			printf("猜大了\n");
		}
		else
		{
    
    
			printf("猜对了!\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
    
    
		printf("你失败了,正确答案是:%d\n",num);
	}
}

void menu() {
    
    

	printf("********************\n");
	printf("***  1.开始游戏  ***\n");
	printf("***  2.退出游戏  ***\n");
	printf("********************\n");
}

int main() {
    
    
	int input = 0;
	srand((unsigned int)time(NULL));//初始化种子,让rand()可以调用随机数
	do
	{
    
    
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
    
    
		case 1:
			game();
			break;
		case 2:
			printf("游戏结束\n");

			//这里的break跳出的是switch结构,不用goto弹出游戏结束后还会继续循环菜单
			goto out;
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);

	out:
	printf("成功退出游戏");
	return 0;
}

resultado de ejecución
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_45657848/article/details/132005256
Recomendado
Clasificación