Ir ao conteúdo

C Números aleatórios em c


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

Oi gente, estou desenvolvendo um programa de loteria, que precisa utilizar funções no desenvolvimento. O programa sorteia aleatoriamente números entre os números 1 e 30 e depois compara com os números digitados pelo usuário. Até o momento consegui fazer isso, porém os números que são sorteados saem sempre iguais e eu não sei como mudar isso.

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

int sorteio()
{
    int numero;
    srand(time(NULL));
    numero = rand() %30 + 1;
    return numero;
}

int digitar()
{
    int num;
    do
    {
    printf("Digite um número:");
    scanf("%d", &num);
    if (num <1 || num > 30)
    {
        printf("Número inválido\n");
    }
    }while (num <1 || num > 30);
    return num;
}

int main(){
setlocale(LC_ALL, "Portuguese");
    int num1, num2, num3, sort1, sort2, sort3, total = 0;

    num1 = digitar();
    num2 = digitar();
    num3 = digitar();


    sort1 = sorteio();
    sort2 = sorteio();
    sort3 = sorteio();

    if (num1 == sort1 || num1 == sort2 || num1 == sort3)
    {
        total++;
    }

    if (num2 == sort1 || num2 == sort2 || num2 == sort3)
    {
        total++;
    }

    if (num3 == sort1 || num3 == sort2 || num3 == sort3)
    {
        total++;
    }

    printf("\nOs números sorteados foram: %d, %d, %d\n", sort1, sort2, sort3);
    
    if (total = 0)
    {
        printf("\nVocê não acertou nenhum numero");
    }

    if (total = 1)
    {
        printf("\nParabéns, você acertou 1 número e ganhou um prêmio de consolação!");
    }

    if (total = 2)
    {
        printf("\nParabéns, você acertou 2 números e ganhou um prêmio de consolação!");
    }

    if (total = 3)
    {
        printf("\nParabéns, você ganhou acertou 3 números e ganhou o super prêmio!!!");
    }

return 0;
}

Alguém sabe me dizer como faço para que os números sorteados sejam diferentes?

  • Obrigado 2
Postado
59 minutos atrás, vangodp disse:

coloque a seguinte linha no inicio do main:
 


int main(){
	srand ( time ( NULL ) );
	...

Precisa fazer a inclusão da biblioteca time.h para usar a função time.

Fiz isso e ainda não funcionou... A biblioteca time.h já estava inclusa no programa. Tem mais alguma ideia?

  • Curtir 1
  • Solução
Postado

Boa Noite,

 

Passar srand para corpo da main deveria ser o bastante, pelo menos no teste rápido aqui ocorreu como esperado, e no final a função ficou com essa cara,

 

int
sorteio (void) {
	return ((rand () % 30) + 1);
}

 

Ainda assim, pode ter sorteios iguais (repetidos) isso é normal, é uma característica das funções randômicas repetir valores principalmente quando envolve aritmética modular.

 

Se esse é o problema então esta discussão talvez ajude:

"

 

  • Obrigado 1
Postado

Uma solução alternativa poderia ser assim:

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


#define QUANTIDADE 3


int contem(int *vetor, int valor);

void imprimir(char *mensagem, int *vetor);

int sortear();


int main() {
    setlocale(LC_ALL, "Portuguese");
    srandom(time(NULL));

    int jogos[QUANTIDADE] = {0, 0, 0};
    int sorteios[QUANTIDADE] = {0, 0, 0};

    int entrada = 0;
    int acertos = 0;

    for (int i = 0; i < QUANTIDADE; ++i) {
        // Garante que a entrada seja válida e não repetida
        do {
            printf("Digite um número entre 1 e 30 [ %i de %i ]: ", (i + 1), QUANTIDADE);
            scanf(" %i%*c", &entrada);
        } while (entrada < 1 || entrada > 30 || contem(jogos, entrada) == 1);

        jogos[i] = entrada;

        // Garante que não seja sorteado valores repetidos
        do {
            entrada = sortear();
        } while (contem(sorteios, entrada) == 1);

        sorteios[i] = entrada;
    }

    // Compara todos os valores
    for (int i = 0; i < QUANTIDADE; ++i) {
        for (int j = 0; j < QUANTIDADE; ++j) {
            if (jogos[i] == sorteios[j]) {
                acertos += 1;
            }
        }
    }

    imprimir("   Jogos", jogos);
    imprimir("Sorteios", sorteios);

    switch (acertos) {
        case 0:
            printf("[ I ]: Você não acertou nenhum número. \n");
            break;
        case 1:
        case 2:
            printf("[ I ]: Parabéns, você acertou %i números e ganhou um prêmio de consolação! \n", acertos);
            break;
        case 3:
            printf("[ I ]: Parabéns, você acertou 3 números e ganhou o super prêmio!!!");
            break;
        default:
            fprintf(stderr, "[ E ]: Revise a lógica de contagem de acertos. \n");
            exit(EXIT_FAILURE);
    }

    return EXIT_SUCCESS;
}


/**
 * Verifica se o valor existe no vetor.
 *
 * @param vetor Onde deve procurar.
 * @param valor O que deve procurar.
 *
 * @return 0 se não contém. 1 se contém.
 */
int contem(int *vetor, int valor) {
    for (int i = 0; i < QUANTIDADE; ++i) {
        if (vetor[i] == valor) {
            return 1;
        }
    }

    return 0;
}

/**
 * Imprime o vetor com a mensagem.
 *
 * @param mensagem Mensagem para identificar o vetor.
 * @param vetor    Vetor que será impresso.
 */
void imprimir(char *mensagem, int *vetor) {
    printf("%s: [", mensagem);

    for (int i = 0; i < QUANTIDADE; ++i) {
        printf("%2i", vetor[i]);

        if (i + 1 < QUANTIDADE) {
            printf(", ");
        }
    }

    printf("] \n");
}

/**
 * Gera um número aleatório entre 1 (inclusivo) e 30 (inclusivo).
 *
 * @return Valor inteiro entre 1 e 30.
 */
int sortear() {
    return (int) random() % 30 + 1;
}

 

loteria.txt

  • Obrigado 1
Postado

@Julia_Lucia

 

Bom dia,

Escolheu minha sugestão como "solução", obrigado.

 

Não seria interessante você deixar o teu programa? Faz sentido que o autor da discussão seja também da resposta, não se sinta obrigada a provar nada, é somente mais um encerramento que ajudaria outros leitores assim como fizeram nossos colegas.

"

Postado

 Como sugeriu @mauro_b , vou deixar o programa final para ajudar outros estudantes.

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

//funçao que gera aleatoriamente D ou E
char funcao1()
{
    int num;
    char direcao;

    num = rand() %2;
    if (num == 0)
    {
        direcao = 'D';
    }
    else
    {
        direcao = 'E';
    }
    return direcao;
}

int main(){
    srand(time(NULL));
    setlocale(LC_ALL, "Portuguese");

    int direita = 0, esquerda = 0, limite = 0;
    char direcao, memoria;

    //Iniciando a variável memoria
    direcao = funcao1();
    memoria = direcao;
    printf("%c", direcao);

    if (direcao == 'D')
    {
        direita++;
    }
    else
    {
        if (direcao == 'E')
        {
          esquerda++;
        }

    }

    limite++;

    //Repetição até que ocorra 4 curvas para o mesmo lado
    while (direita < 4 && esquerda < 4 && limite < 10000)
    {
        limite++;
        direcao = funcao1();
        printf("%c", direcao);

        if (memoria == direcao)
        {
            if (direcao == 'D')
            {
                direita++;
            }
            else
            {
                if (direcao == 'E')
                {
                    esquerda++;
                }

            }
        }
        else
        {
            if (direcao == 'D')
            {
                esquerda = 0;
                direita++;
            }
            else
            {
                if (direcao == 'E')
                {
                    direita = 0;
                    esquerda++;
                }
            }
        }
        memoria = direcao;
    }

    //Imprimir o numero de voltas
    if (limite == 10000)
    {
        printf("O carro não completou uma volta em 10000 curvas");
    }
    else
    {
       printf("\n\nO carro andou uma volta completa e fez %d curvas\n", limite);
    }

 return 0;
}

 

  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...