ThiagoMatheus Posted February 11, 2014 at 03:05 PM Report #544844 Posted February 11, 2014 at 03:05 PM Alguém sabe como eu posso gerar um vetor de n posições sem que haja repetição dos elementos desse vetor, onde os elementos são do tipo int e são aleatórios, Ex: 1 3 5 6 2 9 0 8
HappyHippyHippo Posted February 11, 2014 at 03:12 PM Report #544845 Posted February 11, 2014 at 03:12 PM - 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 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
cdgramos Posted February 11, 2014 at 05:19 PM Report #544869 Posted February 11, 2014 at 05:19 PM (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 February 11, 2014 at 05:22 PM by cdgramos www.cdgramos.com
HappyHippyHippo Posted February 11, 2014 at 05:25 PM Report #544870 Posted February 11, 2014 at 05:25 PM 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 Portugol Plus
cdgramos Posted February 11, 2014 at 05:31 PM Report #544872 Posted February 11, 2014 at 05:31 PM (edited) 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 Edited February 11, 2014 at 05:31 PM by cdgramos 1 Report www.cdgramos.com
ThiagoMatheus Posted February 11, 2014 at 05:31 PM Author Report #544873 Posted February 11, 2014 at 05:31 PM (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 February 11, 2014 at 06:48 PM by thoga31 Tags code + GeSHi
HappyHippyHippo Posted February 11, 2014 at 05:33 PM Report #544875 Posted February 11, 2014 at 05:33 PM (edited) #define TAM 100 // ... int i = rand()%TAM; usa o meu algoritmo ... Edited February 11, 2014 at 05:33 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
ThiagoMatheus Posted February 11, 2014 at 05:35 PM Author Report #544876 Posted February 11, 2014 at 05:35 PM 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!
HappyHippyHippo Posted February 11, 2014 at 05:37 PM Report #544877 Posted February 11, 2014 at 05:37 PM Verdade, quero de 1 a 1 milhão então porque razão estás a guardar o resto da divisão do número gerado pelo valor TAM ? porque está a chover ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
cdgramos Posted February 11, 2014 at 05:44 PM Report #544879 Posted February 11, 2014 at 05:44 PM 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); 1 Report www.cdgramos.com
ThiagoMatheus Posted February 11, 2014 at 05:45 PM Author Report #544881 Posted February 11, 2014 at 05:45 PM 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!
thoga31 Posted February 11, 2014 at 06:50 PM Report #544893 Posted February 11, 2014 at 06:50 PM 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!
Flinger Posted February 11, 2014 at 06:57 PM Report #544899 Posted February 11, 2014 at 06:57 PM 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.
thoga31 Posted February 11, 2014 at 07:03 PM Report #544901 Posted February 11, 2014 at 07:03 PM 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!
ThiagoMatheus Posted February 11, 2014 at 07:51 PM Author Report #544912 Posted February 11, 2014 at 07:51 PM 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.
thoga31 Posted February 11, 2014 at 08:54 PM Report #544920 Posted February 11, 2014 at 08:54 PM 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!
ThiagoMatheus Posted February 12, 2014 at 03:20 PM Author Report #545042 Posted February 12, 2014 at 03:20 PM (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 February 12, 2014 at 03:23 PM by thoga31 Tags code + GeSHi
thoga31 Posted February 12, 2014 at 03:24 PM Report #545045 Posted February 12, 2014 at 03:24 PM @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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now