Ir ao conteúdo
  • Cadastre-se

C Números aleatórios em c


Julia_Lucia
Ir à solução Resolvido por Ansi C,

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
Compartilhar em outros sites

Recomendo dar uma olhada no algorítimo Fisher Yates.

 

Um exemplo do funcionamento do algorítimo em C.

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

/* Constantes */
#define Q_NUMEROS 30

int main(void)
{
   int tmp, numeros[Q_NUMEROS];
   /* Inicia o vetor */
   for (tmp = 0; tmp < Q_NUMEROS; tmp++) {
      numeros[tmp] = tmp+1;
   }

   /* Inicia o gerador de numeros do sistema */
   srand(clock());

   /* Embaralha os numeros */
   for (tmp = 0; tmp < Q_NUMEROS; tmp++) {
      int aux, indice = rand()%Q_NUMEROS;
      /* Troca o valor de posição no vetor */
      aux = numeros[indice];
      numeros[indice] = numeros[tmp];
      numeros[tmp] = aux;
   }

   /* Mostra os valores aleatorios */
   for (tmp = 0; tmp < Q_NUMEROS; tmp++) {
      printf("\n%i",numeros[tmp]);
   }

   /* Pausa o programa */
   getchar();
   return(0);
}

 

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

@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.

"

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

 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 2
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!