Jump to content

Criar um vetor de números aleatórios sem repetição?


Recommended Posts

Posted

- cria um array com o tamanho igual ao número de elementos

- preenches o array com os valores todos que pretendes ter baralhados

- baralhas os números com o seguinte algoritmo:

- para um valor I de 0 a N - 1, com N o número de elementos do array
 - escolhes um número aleatório A entre I e N - 1
 - se I for diferente de A então
   - trocas o valor da posição A com o da posição I
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

outro método para além do que o HappyHippyHippo apresentou:

-Crias o vetor.

-Usas a função para gerar números aleatórios da linguagem que estas a usar (rand() em C).

-A cada número gerado verificas se já está no vetor (até à posição onde o vais inserir).

-Se não existe colocas na posição

-Caso contrário geras um novo e voltas a verificar

Edited by cdgramos
Posted

outro método para além do que o HappyHippyHippo apresentou:

-Crias o vetor.

-Usas a função para gerar números aleatórios da linguagem que estas a usar (rand() em C).

-A cada número gerado verificas se já está no vetor (até à posição onde o vais inserir).

-Se não existe colocas na posição

-Caso contrário geras um novo e voltas a verificar

para geração de uma lista de valores de 1 a 10, e caso estejas a gerar números de 1 a 10.

- a geração do 1º valor tem 0% de probabilidade de ser repetido

- a geração do 2º valor tem 10% de probabilidade de ser repetido

- a geração do 3º valor tem 20% de probabilidade de ser repetido

- a geração do 4º valor tem 30% de probabilidade de ser repetido

- a geração do 5º valor tem 40% de probabilidade de ser repetido

- ...

- ...

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

Já pensei também em verificar se já está no vetor mas por exemplo, eu estou usando o rand( ) e portanto vem um numero aleatorio, como segue o código abaixo:

OBS.: TAM 100

while( cont <= TAM ) //loop para ler os int do arquivo.
   {

       int i = rand()%TAM;


       for(j=0;j<cont;j++){
           if(i == numeros[j])
                  i = rand()%TAM;  ***->***Aí ele gera outro número aleatório, mas quando ele insere outro número ele não verifica de novo se ele já existe!
       }

       numeros[i] = i;  //lê números inteiros no arquivo apontado por fp.
       fprintf(fp,"%d\t", numeros[i]);  //mostra os números na tela.
       cont++;
   }
Edited by thoga31
Tags code + GeSHi
Posted

ele exemplificou com os números de 0 a 9 mas acho que o ThiagoMatheus quer uns valores quaisquer acho eu, tipo: 25, 100, 1058, 2, 3687, 3, etc...

pelo menos foi assim que percebi xD

Verdade, quero de 1 a 1 milhão kkkkkkkkkkkkkkkk, projeto de Algoritmo e Estrutura de Dados, aí estou tentando gerar 1 milhão de dados não repetidos para então poder carrega-los numa lista e numa pilha!

#define TAM 100

// ...

int i = rand()%TAM;

usa o meu algoritmo ...

Tá faltando? Postei o meu aí, só que como estou fazendo ele continua a repetir!

Posted

o teu código está confuso, ou então os comentários :S

"//loop para ler os int do arquivo." o que é o arquivo para ti?

"numeros = i; //lê números inteiros no arquivo apontado por fp." ???

"fprintf(fp,"%d\t", numeros); //mostra os números na tela." //na tela não, isto é para escrever para um ficheiro

já agora, para gerares números entre 1 e 1.000.000:

int randomNumber(int min, int max){
   int diff = max-min;
   return (int) (((double)(diff+1)/RAND_MAX) * rand() + min);
}
int x = randomNumber(1,1000000);
  • Vote 1
Posted

o teu código está confuso, ou então os comentários :S

"//loop para ler os int do arquivo." o que é o arquivo para ti?

"numeros = i; //lê números inteiros no arquivo apontado por fp." ???

"fprintf(fp,"%d\t", numeros); //mostra os números na tela." //na tela não, isto é para escrever para um ficheiro

Desculpa, é porque sou brasileiro e esse é o modo mais fácil para entendermos por aqui o que o algoritmo eestá fazendo! 😛

Na verdade é assim, o primeiro while ele está inserindo dados no arquivo até o cont ser menor ou igual ao número de dados que quero inserir, no 2º comentário o número gerado é guardado no vetor e em seguida no 3º ele é guardado em um arquivo txt,onde é possível visualizá-lo através do bloco de notas!

Posted

Sendo brasileiro ou não, a "tela" é o monitor, segundo sei, e, por exemplo, o fprintf coloca dados num ficheiro (ou arquivo) e não na tela. Portanto, os comentários do @cdgramos são válidos e merecedores de serem levados em conta.

Knowledge is free!

Posted

o fprintf coloca dados num ficheiro (ou arquivo) e não na tela

Não se o fp "apontar" para o stdout 😛

PS: desculpem, foi só para meter nojo e descomprimir um bocado dos problemas do trabalho. De qualquer forma os comentários do @cdgramos são pertinentes. Ao pedirem ajuda convém darem a informação da forma mais clara possível.

Posted

Não se o fp "apontar" para o stdout 😛

Oh, claro. Mas também sejamos sinceros - isso era quase o reinventar da roda 😄

PS: desculpem, foi só para meter nojo e descomprimir um bocado dos problemas do trabalho. De qualquer forma os comentários do @cdgramos são pertinentes. Ao pedirem ajuda convém darem a informação da forma mais clara possível.

Para meter nojo? Que nojo? Talvez querias dizer "para picar um pouco"? Não vejo nada de nojento no teu post 😛

Knowledge is free!

Posted

Sendo brasileiro ou não, a "tela" é o monitor, segundo sei, e, por exemplo, o fprintf coloca dados num ficheiro (ou arquivo) e não na tela. Portanto, os comentários do @cdgramos são válidos e merecedores de serem levados em conta.

Eu sei que a tela é o monitor -_- e também sei que o fprintf coloca os dados no arquivo, mas para ficar mais fácil para os outros que estão pegando comigo da turma entender, foi melhor escrever que "mostra os números na tela" pois esse aí não é o código completo e o "mostrar na tela" tá se referindo não ao imprimir de um printf, mas sim pra mostrar na tela quando tiver guardado no arquivo, podendo assim abrir um txt que é o caso e poder ver todos os números armazenados.

Posted

Eu sei que a tela é o monitor -_- e também sei que o fprintf coloca os dados no arquivo

Ninguém disse que não sabias. Apenas resumi os factos para formular um ponto de vista.

Sinceramente fiquei sem perceber como é que vocês deduzem tanta coisa de um comentário vago e erróneo. Mas isso não me compete a mim. Eu sempre fiz comentários objectivos, mas isso sou eu.

<fim do assunto>

Quanto à tua questão inicial, estás esclarecido? Tens mais alguma dúvida que gostarias de ver tratada?

Knowledge is free!

Posted (edited)

Ninguém disse que não sabias. Apenas resumi os factos para formular um ponto de vista.

Sinceramente fiquei sem perceber como é que vocês deduzem tanta coisa de um comentário vago e erróneo. Mas isso não me compete a mim. Eu sempre fiz comentários objectivos, mas isso sou eu.

<fim do assunto>

Quanto à tua questão inicial, estás esclarecido? Tens mais alguma dúvida que gostarias de ver tratada?

Não, já consegui. Eu só acho que vocês puxaram o assunto para um lugar que não precisava, pois sabiam qual era o real objetivo, apenas criar um vetor de 1000000 de dados sem repetição, e não precisaca fazer todo esse arrodeio por causa de uns comentários, pois eu acho que o comentário do código é uma coisa reservada a cada um, e como foi a maneira mais fácil dos outros entenderem o projeto, não tinha pra quê fazer tudo isso.

Esquecendo toda essa história, aqui tá o código, e sem comentários agora "kkkkkkkkkkkkkkkkkkkkk" :

#include <stdio.h>
#include <stdlib.h>
#define S 30000

void shuffle(int *array, size_t n);

int main(int argc, char *argv[]) {
    FILE *fp;
   fp = fopen("B30000.txt", "w");
   if(fp == NULL)
   {
       printf("Erro ao ler o arquivo!");
       exit(1);
   }

   srand( time(NULL) );

   long int aleatorio[s];
   int i;
   for (i = 0; i < S; i++)
       aleatorio[i] = i;


   shuffle(aleatorio, S);

   for (i = 0; i < S; i++){
      // printf("Pegando o numero %d\n", aleatorio[i]);
       fprintf(fp,"%d\t", aleatorio[i]);
   }

   printf("\n\nDados arquivados com sucesso!");
   printf("\nPressione uma tecla para finalizar...");

   getch();
   fclose(fp);
   return 0;
}

void shuffle(int *array, size_t n)
{
   if (n > 1)
   {
       size_t i;
       for (i = 0; i < S; i++)
       {
         size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
         int t = array[j];
         array[j] = array[i];
         array[i] = t;
       }
   }
}
Edited by thoga31
Tags code + GeSHi
Posted

@ThiagoMatheus, coloca o código dentro das tags code, sff, indicando a linguagem para que seja feito highlight. Não reparaste que te tenho modificado todos os posts? Ainda não te perguntaste como é que nós colocamos o código todo bonito?

Knowledge is free!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.