Ir ao conteúdo
  • Cadastre-se
Hamushi

C Gerar números aleatórios não repetidos entre si

Recommended Posts

Bom dia!

Gostaria de saber se eu posso excluir os resultados já obtidos da função rand() para gerar novos números.

Por exemplo: 

#include <stdio.h>
#include <stdlib.h>
  
int main(){
  for(int i=0;i<100;i++)
    printf("Novo valor gerado: %i\n",rand()%200);
  return 0;
}

Nesse caso ele provavelmente exibirá resultados repetidos.

Há alguma forma dele exibir somente resultados novos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para gerar sequencias aleatórias sempre que rodar o programa você pode criar um gerador baseado no tempo do sistema.

 

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

int main() {

    srand (time(NULL));

    for(int i=0;i<100;i++)
        printf("Novo valor gerado: %i\n",rand()%200);
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim. Mas isso é para gerar sequências aleatórias novas, mas nessas novas sequências continuarão havendo repetições.

Existe alguma forma de retirar os resultados já "sorteados" dos próximos que estão por vir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma forma que pensei seria ir armazenando os números já sorteados e condicionar um if que roda novamente a função rand caso o número já esteja na memória. Mas sabe que vai ficar ainda menos aleatório do que a própria função, que já não é propriamente aleatória (dê uma olhada sobre pseudo-aleatoriedade)? Repetição faz parte da aleatoriedade. Qual seria a aplicação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fins didáticos mesmo.

Pensei nessa possibilidade que você comentou, mas para um número muito grande de sequências ele se tornaria ineficaz, já que a cada novo número sorteado a chance de já ter sido sorteado aumentaria. Mas parece que isso é uma limitação dessa função. Pensei que pudesse haver alguma alternativa.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sabe usar lista?

Se sim, faz uma lista com todos os valores possíveis.

Depois usa um rand que vai até o tamanho (quantidade) da lista.

O valor gerado vai ser o indice do numero que você sorteou.

Retire o elemento da lista fazendo os procedimentos corretos e pronto.

 

Deve ter métodos melhores, mas esse é o que eu mais gosto de usar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@MassakiMsk Sim, esse é o melhor método para fazer isso, o que você propôs é uma variação do algoritmo de embaralhamento de Fisher-Yates usando lista.

 

Mas já que no C listas não são parte padrão da linguagem, seu método também envolveria implementar listas, mas não é necessário pode fazer usando um vetor, basicamente para gerar uma sequência aleatória de números sem repetição basta criar um vetor contendo todos os números no intervalo, e embaralhar os números no vetor (usando Fishe-Yates), e obterá a seqüência desejada no vetor.

 

https://en.wikipedia.org/wiki/Fisher–Yates_shuffle

https://pt.wikipedia.org/wiki/Embaralhamento

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×