Seja muito bem vindo à aula 125 do nosso curso gratuito de programação com a linguagem C. Nesta aula irei responder uma dúvida postada na aula 104: como preencher um vetor gerando números com a função rand() sem repetição? Ao gerar uma sequência de números aleatórios não há nenhuma garantia de que algum número na sequência não vá se repetir. Você, enquanto programador, precisa garantir que, ao sortear um valor repetido, este não seja inserido no vetor. Seguindo esse pensamento, para cada novo valor sorteado precisamos percorrer a parte já preenchida do nosso vetor procurando pelo número que acabou se ser sorteado. Caso ele já exista, deve ser descartado e outro valor deve ser sorteado, caso contrário, pode ser inserido no vetor. É esta lógica que iremos implementar na aula de hoje. #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i = 0, j, igual, vet[25]; srand(time(NULL)); do{ // faça vet[i] = rand() % 30; // sorteia um número igual = 0; for(j = 0; j < i; j++){ // percorre a parte do vetor já preenchida if(vet[j] == vet[i]) igual = 1; // número repetido } if(igual == 0) // significa que o elemento não se repetiu i++; }while(i < 25); // enquanto não for sorteado 25 números diferentes for(i = 0; i < 25; i++){ printf("%d ", vet[i]); } printf("\n\n"); return 0; }
Pessoal me ajudem mas eu queria fazer o seguinte, tipo o usuario entra com 3 numeros, o computador gera 3 numeros e compara e fala se acertou ou errou Oque eu faço? Julio
Olá amigo!!! Não entendi uma parte do seu problema… o usuário entra com 3 números… Tipo assim: 10,20,30??? Se for assim… tente o seguinte: [code] // aqui vc coloca as variáveis que receberam o número digitado pelo usuário e cdompara com o numero gerado if (num1==numeroAleatorio || num2==numeroAleatorio||num3==numeroAleatorio){ JOptionPane.showMessageDialog(null, “BINGO”,“ACERTOU”,JOptionPane.INFORMATION_MESSAGE); }[/code] Espero ter ajudado!! Abraços
Cria um array com os 3 valores gerados pelo random.
import java.util.*; //importar as classes necessarias public class Numeros{ public void testarTresNumeros(int num1, int num2, int num3){ boolean numerosIguais = true; //fica falso se pelo menos um num for diferente int[] numeroGerado = new int[3]; //array para colocar num gerados int[] numeroEntrado = {num1, num2, num3}; //array com num entrados //gerar os numeros for(int i=0;i<3;i++){ numeroGerado[i] = (int)(Math.random()*10); // <- defina aqui a dimensão dos num } //verificar se TODOS os numeros são iguais int i=0, j=0; for(i=0; i<3;i++){ for(j=0; j<3; j++){ if(numeroEntrado[i] != numeroGerado[j]) { numerosIguais = false; j=3; i=3; } } } System.out.println("Numeros entrados: "+numeroEntrado[0]+", "+numeroEntrado[1]+", "+numeroEntrado[2]); System.out.println("Numeros gerados: "+numeroGerado[0]+", "+numeroGerado[1]+", "+numeroGerado[2]); if(numerosIguais==true) System.out.println("OS NUMEROS SÃO IGUAIS!"); else System.out.println("OS NUMEROS SÃO DIFERENTES!"); } public static void main(String[] args) throws Exception{ int num1=0, num2=0, num3=0; Scanner in; //leitura dos numeros introduzidos pelo utilizador for(int i=0; i<3; i++){ in = new Scanner(System.in); if(i==0) num1 = in.nextInt(); if(i==1) num2 = in.nextInt(); if(i==2) num3 = in.nextInt(); } //crie o objecto da classe Numeros Numeros n = new Numeros(); n.testarTresNumeros(num1, num2, num3); } }
Sorteie os numeros com a classe Random Random rdm = new Random(); int numero = rdm.nextInt(100);//100 é o numero limite
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 Pular para a primeira mensagem não lida não lida, 14 de ago. de 2014 21:49:1114/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para Boa noite galera, sou novato em programação e estou adorando aprender C. [1] http://pastebin.com/qA0yVsvG ps: Adorei saber que existe uma lista de c/c++ e que se a duvida estiver algo fora dos conformes me avisem.não lida, 14 de ago. de 2014 21:57:1814/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para Já fiz algo parecido um ha muito tempo atras para gerar numero para jogo da loteria, porem com randomize sempre algum número irá repetir. O meio que fiz para contornar o problema foi dar sorte na lista e comparar todos com todos para ver se tinha algum repetido, caso tivesse geraria um novo e fazia a comparação novamente até não encontrar mais números repetidos. espero ter ajudado. > -- > Antes de enviar um e-mail para o grupo leia: > http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar > --~--~---------~--~----~------------------------------> [&] C & C++ Brasil - http://www.ccppbrasil.org/ > Para sair dessa lista, envie um e-mail para> > Para mais opções, visite http://groups.google.com/group/ccppbrasil > --~--~---------~--~----~--~-~--~---~----~------------ não lida, 14 de ago. de 2014 22:01:2914/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para não lida, 14 de ago. de 2014 22:35:0014/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para Não conheço nenhuma solução pronta, mas para vetores pequenos você pode sempre comparar elemento a elemento do seu vetor para ver se este número já fora sorteado. Já para vetores maiores começa a ficar custoso e pode complicar. Tem uma solução que eu vi numa dessas maratonas de programação que mostrava um método de gerar números aleatórios que era assim: SEED = um numero que não seja múltiplo de MAX MAX = valor máximo a ser gerado Valor_Random = (Valor_Random + SEED ) % MAX Se o SEED não for múltiplo de MAX ele irá gerar valores "aleatorios" sem repetição até não ter mais possibilidades, aí ele começa a série novamente. Valor_Random = (Valor_Random + 3333) % 444 Série gerada para valor inicial de Valor_Random = 0: Desvantagem: Aleatoriedade é bem "fraquinha" não lida, 14 de ago. de 2014 23:02:4514/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para Não sei como fazer, até porque no C++ foram criadas novas classes para isso. Exemplo abaixo se quiserem ver é algo que eu escrevi enquanto estava estudando, sinceramente fui olhar e nem eu entendi, mas está bem escrito. Demostra justamente as novas engines e acho que usei distribuição também. Esse rand do C é muito fraco e você vai precisar mais do que um simples % para fazer algo realmente randomico. https://github.com/malkaviano/CPP/blob/master/Random_int.h e .cpp Pensando agora, deveria ter convertido em template... Coisas de aprendiz. Essa é minha contribuição ao comentário do 'Skhaz'. não lida, 15 de ago. de 2014 08:00:1515/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para
Outra maneira de fazer é criar um array de 25 elementos; onde cada elemento é um par de um contador (1..25) e o outro é um número aleatório qualquer... aí vc ordena o array com qqr sort que vc tiver pelo segundo elemento. O seus 1..25 vão estar então em uma ordem aleatória e com certeza não vai estar repetido. não lida, 15 de ago. de 2014 08:11:0815/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para Você esta sugerindo um shuffle então? Parece interessante. Mas dai já se sabem os valores "sorteados", mesmo que não a ordem. No caso da megasena seria inviável. Pois são seis números num range 1..60. Usando seu exemplo ficariam 6 números do 1 ao 6 só que sem ordem. não lida, 15 de ago. de 2014 08:13:1315/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para
Não. No meu caso seria um array de 60 elementos, de 1..60. O ponto é exatamente ter um array com cada elemento representando uma das bolas. Vc aleatoriza a ordem, e pega os 6 primeiros. não lida, 15 de ago. de 2014 08:24:4215/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para Entendi. Ficaria O(n). Gostei. Bem melhor do que iterar e verificar a cada gerado pelos atuais. não lida, 15 de ago. de 2014 09:13:2615/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para Uma opção seria: int size = ...; int a = ...; int b = ...; std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(a, b); std::set<int> s; int n = 0; while (n != size) { auto pair = s.insert(dis(gen)); if (pair.second) break; ++n; } std::copy(std::begin(s), std::end(s), std::ostream_iterator<int>(std::cout, " ")); Em vez de copiar pra tela você manda pra umvetor por exemplo. Vai terminar com os números aleatórios ordenados no seu vetor sem repetição. Normalmente o std::set tem um desempenho ruim e talvez você queira escrever seu próprio set ou usar alternativos. Marcelo Em 15 de agosto de 2014 09:24, Rodrigo Madera <> escreveu: não lida, 15 de ago. de 2014 14:22:1715/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para On Thursday, August 14, 2014 10:49:11 PM UTC-3, Davi mendes wrote:
#include <stdlib.h> // srand, rand, rand_max para gerar numeros pseudo aleatorios. #include <time.h> // time usado para ALIMENTAR a SEED. int numerosLotoFacil[MAX], i, j; srand(time(NULL)); // srand ALIMENTA a rand. parametro é o tempo atual. {numerosLotoFacil[i] = i+1;} j = MAX - (rand() % (MAX - i)) -1; // gera um numero. int tmp = numerosLotoFacil[j]; numerosLotoFacil[j] = numerosLotoFacil[i]; numerosLotoFacil[i] = tmp; printf("número pseudo aleatório : %d\n", numerosLotoFacil[i]); não lida, 15 de ago. de 2014 21:21:2815/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para não lida, 16 de ago. de 2014 00:52:0216/08/2014 Faça login para responder ao autor Faça login para encaminhar Você não tem permissão para excluir mensagens no grupo Denunciar mensagem como abuso Faça login para denunciar a mensagem por abuso Mostrar mensagem original Os endereços de e-mail são anônimos para o grupo ou a permissão para ver os endereços de e-mail dos participantes é necessária para ver a mensagem original. para |