Duvida em lógica C, números aleatórios SEM REPETIÇÃO.

1,187 views
Skip to first unread message

Davi mendes

unread,
Aug 14, 2014, 9:49:11 PM8/14/14
to ccppb...@googlegroups.com
Boa noite galera, sou novato em programação e estou adorando aprender C.
Porém estou com uma duvida que tento resolver já a um tempo e só piora cada vez que tento de novo e de novo rsrsrs.

O problema é o seguinte, quero gerar números aleatórios e armazenar em um array, simples mas SEM REPETIÇÕES.

Já tentei ver alguns códigos no google a fora, mas a maioria depois de alguns testes um numero se repete, ai fica fácil chegar no fórum falar que resolveu e postar algo sem que ninguém teste mais vezes.

Meu código de quem esta começando (peguem leve) esta aqui conforme o link do pastebin [1].

Agradeço qualquer luz que não seja algo mirabolante para um iniciante.

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

João Batista da Silva

unread,
Aug 14, 2014, 9:57:18 PM8/14/14
to ccppb...@googlegroups.com
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
> ccppbrasil-...@googlegroups.com
> Para mais opções, visite http://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~--~-~--~---~----~------------

Francisco Lopes

unread,
Aug 14, 2014, 10:01:29 PM8/14/14
to ccppb...@googlegroups.com
Para o seu caso, que quer gerar números de 1 a 25, se vc tivesse em um array
os números de 1 a 25 desordenados e os tirasse um a um como se fosse a geração de
um numero randômico não te resolveria?


Alexandre Caldas

unread,
Aug 14, 2014, 10:35:00 PM8/14/14
to ccppb...@googlegroups.com
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.
Exemplo:

Valor_Random = (Valor_Random + 3333) % 444

Série gerada para valor inicial de Valor_Random = 0:
225, 6, 231, 12, 237, 18.... 221, 0, 225

Desvantagem: Aleatoriedade é bem "fraquinha"
Vantagem: Não se repete
--
Alexandre Caldas de Oliveira
Discente de Engenharia da Computação - FT/UFAM
Centro Acadêmico de Engenharia da Computação - CAECOM

Rafael Silva

unread,
Aug 14, 2014, 11:02:45 PM8/14/14
to ccppb...@googlegroups.com
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.


Pensando agora, deveria ter convertido em template... Coisas de aprendiz.

Essa é minha contribuição ao comentário do 'Skhaz'.

Att,

Gianni

unread,
Aug 15, 2014, 8:00:15 AM8/15/14
to ccppb...@googlegroups.com

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.

Rodrigo Madera

unread,
Aug 15, 2014, 8:11:08 AM8/15/14
to ccppb...@googlegroups.com
Gianni,

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. 

Entendi certo?

Madera 

Gianni

unread,
Aug 15, 2014, 8:13:13 AM8/15/14
to ccppb...@googlegroups.com

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.

Rodrigo Madera

unread,
Aug 15, 2014, 8:24:42 AM8/15/14
to ccppb...@googlegroups.com
Entendi. Ficaria O(n). Gostei. 

Bem melhor do que iterar e verificar a cada gerado pelos atuais. 

Madera

Marcelo Zimbres

unread,
Aug 15, 2014, 9:13:26 AM8/15/14
to ccppb...@googlegroups.com
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
<rodrigo...@gmail.com> escreveu:

JuciÊ Andrade

unread,
Aug 15, 2014, 2:22:17 PM8/15/14
to ccppb...@googlegroups.com
On Thursday, August 14, 2014 10:49:11 PM UTC-3, Davi mendes wrote:
Boa noite galera, sou novato em programação e estou adorando aprender C.
...

#include <stdio.h>  //                                                                        
#include <stdlib.h> // srand, rand, rand_max para gerar numeros pseudo aleatorios.            
#include <time.h>  // time usado para ALIMENTAR a SEED.
                                                                                              
int main(){                                                                                   
#define MAX 25                                                                                
int numerosLotoFacil[MAX], i, j;                                                              
                                                                                              
srand(time(NULL)); // srand ALIMENTA a rand. parametro é o tempo atual.                      
                                                                                              
//preenche                                                                                    
for(i=0; i<MAX; i++)                                                                          
    {numerosLotoFacil[i] = i+1;}                                                              
                                                                                              
for(i=0; i<10; i++){                                                                          
    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]);                        
    }                                                                                         
}                                                                                             

Davi mendes

unread,
Aug 15, 2014, 9:21:28 PM8/15/14
to ccppb...@googlegroups.com
Curti a alternativa de "catar" aleatórios . Vou tentar fazer .
Complementando, alguém indicaria sites ou algo que de exercícios para programação em c? Estou fazendo alguns do site [1] .
Obrigado galera!

[1] http://programacaodescomplicada.wordpress.com/indice/linguagem-c/


    }                                                                                         
}                                                                                             

Cooler_x0a

unread,
Aug 16, 2014, 12:52:02 AM8/16/14
to ccppb...@googlegroups.com
Rapaz,
Leia o tópico "entropy"
http://wiki.openssl.org/index.php/Random_Numbers




Em quinta-feira, 14 de agosto de 2014 22h49min11s UTC-3, Davi mendes escreveu:
Reply all
Reply to author
Forward
0 new messages