3
respostas

srand() e rand()

fiquei com uma dúvida sobre o que são e como exatamente funcionam o srand() e o rand()

no código da adivinha utilizamos

    int segundos = time(0);
    srand(segundos);

enquanto no código da forca fizemos direto o srand() de time(0), beleza. até aí tudo bem...

srand(time(0));

mas no código da adivinha declaramos uma variável numerogrande = rand(), para depois dividir o** numerogrande** pelo valor que queríamos obter, enquanto no código da forca dividimos diretamente o rand() % qtdetentativas

entendo que está dando tudo na mesma e suponho que no primeiro código o prof possa ter sido mais específico e meticuloso pra facilitar nosso entendimento, enquanto agora no código da forca já esteja nos mostrando formas mais diretas de fazer as coisas..

ainda assim, fiquei bem na dúvida de como exatamente funcionam o rand() e o srand() e quem são?, do que se alimentam?, onde vivem? tudo isso e muito mais hoje no fantástico

3 respostas

o código do adivinha (metade)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main() {
    int segundos = time(0);
    srand(segundos);

    int numerogrande = rand();

    int chute;
    int numeroSecreto = numerogrande % 100;
    int tentativa = 1;
    double pontos = 1000;
    int numerodetentativas = 5;
    int nivel;

    int acertou = 0;

    printf("Escolhi um numero menor que 100.\nConsegue adivinhar qual?\n\n");
    printf("Selecione o nivel de dificuldade\n");
    printf("(1)Facil (2)Medio (3)Dificil\n");
    printf("Digite 1, 2 ou 3: ");
    scanf("%d", &nivel);

    switch(nivel) {
    case 1:
        numerodetentativas = 15;
        break;
    case 2:
        numerodetentativas = 10;
        break;
    default:
        numerodetentativas = 5;
        break;
    }
    printf("\n*********************************\n");
    printf("\nVoce tem %2d chances para acertar!\n", numerodetentativas);
    printf("\n*********************************\n");

   for(int i = 1; i <= numerodetentativas; i++){

        printf("\n[tentativa %d]\nDigite seu chute e aperte ENTER: ", tentativa);
        scanf("%d", &chute);

        if (chute < 0 ) {
            printf("EPA! Vamos mexer apenas com numeros POSITIVOS, ok? \nTente um numero maior que zero ;D\n");
            continue;
        }

        acertou = (chute == numeroSecreto);
        int maior = chute > numeroSecreto;
        double pontosperdidos = abs(chute - numeroSecreto) / (double)2;
        pontos = pontos - pontosperdidos;

        if (acertou) {
            break;
        }
        else if (maior) {
            printf("Nope! %d eh MAIOR que meu numero...\n", chute);
            tentativa++;
        }
        else {
            printf("Nope! %d eh MENOR que meu numero...\n", chute);
            tentativa++;
        }

    }
    printf("\n\n--------- Fim de jogo! ---------\n");

e o trecho do de forca com a função** escolhepalavra()**

void escolhepalavra(){

    FILE* f;

    f = fopen("palavras.txt", "r");

    int qtdepalavras;

    fscanf(f, "%d", &qtdepalavras);

    srand(time(0));

    int randomico = rand() % qtdepalavras;

    for(int i = 0; i <= qtdepalavras; i++){

        fscanf(f, "%s", palavrasecreta);

    }

    fclose(f);
}

Olá, Caique! Tudo bem?

O range nos passa um valor aleatório de um intervalo entre 0 e RAND_MAX. O RAND_MAX pode ser alterado. No nosso caso temos:

int numerogrande = rand();
int numeroSecreto = numerogrande % 100;

O % 100 é usado para limitar o intervalo entre 0 e 99. O número 100 é nosso RAND_MAX.

Acontece que dentro de um mesmo intervalo ele sempre irá gerar o mesmo valor. Inclusive, caso você gere mais de um valor eles sempre serão o mesmo também. Isso prejudicaria nosso jogo. Aqui entra o srange

Para de fato gerar números aleatórios diferentes em cada vez que ele roda precisamos de uma semente. Essa semente quando usamos apenas o rand é fixa. O programa adota a semente como 1.

Utilizando srand(time(0)); garantimos que a semente será sempre diferente já que estamos utilizando o time(0). Dessa forma os números de fatos são sempre aleatórios. Em resumo, o srand vai definir essa semente e ela passa a assumir o valor do time(0).

Espero ter ajudado.

Qualquer dúvida, estou à disposição.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software