gRoOvE 0 Denunciar post Postado Fevereiro 20, 2009 Estou usando esta função pra gerar números aleatórios, porém não sei se o problema está na função ou na hora de exibir, estou usando a notação %ul, mas só mostra até 32000, como se fosse signed decimal, alguém da um help?? #include <time.h> void VetorAleatorio(unsigned long int *v,unsigned long int max) { unsigned long int i; srand(time(NULL)); for(i=0;i<max;i++) { v[i] = rand() % 500000; } } Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Fevereiro 20, 2009 rand retorna um número entre 0 e RAND_MAX dá uma olhada: http://www.cplusplus.com/reference/clibrar...tdlib/rand.html Chances são que seu RAND_MAX está definido para alguma coisa perto de 32000. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Fevereiro 20, 2009 Exato Enésio, tentei alterar o valor do MAX_RAND porém não obtive sucesso. Tendo em vista essa informação "Its default value may vary between implementations but it is granted to be at least 32767.", não tem como alterar mesmo? Se não tiver como, tem algum palpite de como resolver esta situação, pois eu preciso dessa quantidade de numeros diferentes pra testar uns métodos de ordenação. Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Fevereiro 20, 2009 Você checou na stdlib.h e mudou lá o RAND_MAX? Se não dá assim, acho que até dá pra fazer uma gambiarra hehehe, faça dois rands de 25000 e adicione um ao outro! Agora pensei em outra gambiarra um pouco menos porca: Faça um rand() % 501, e um rand() % 1000; Agora acho que dá pra fazer de 2 maneiras: multiplique o 1º rand() por 1000, e adicione o 2º; ou divida o 2º rand() por 1000 e adicione os dois em uma variável float. Essa gambiarra aqui parece um pouco mais viável hehehe Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Fevereiro 20, 2009 POG na área ;D Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Fevereiro 20, 2009 Cara, parece que deu certo, tem uns números repetindo ainda, acredito que seja porque ultrapassou o limite dos random, qual o limite nesse teu algoritmo?? Tipo, só pra eu entender, o rand() pode ser um número qualquer entre 0 e MAX_RAND, vou pegar o resto da divisão desse tal número pelo 501, a mesma coisa com a linha de baixo porém com o resto do 1000, ai multiplico aux por 1000 e somo aux1, não consigo ver a lógica disso =(( for(i=0;i<max;i++) { aux = rand() % 501; aux1 = rand() % 1000; v[i] = (aux * 1000) + aux1; } POG? :D Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Fevereiro 20, 2009 É POG mas se não funcionou do outro jeito vai ter que funcionar assim. O que isso aí faz é que cada rand pega 3 casas do número final. O primeiro pega as casas de milhar, dezena de milhar e centena de milhar, e o segundo pega as casas de centena, dezena e unidade. Depois ele combina os dois números para dar o número final que foi escolhido aleatoriamente. Não tem mistério. Esse algoritmo só vai ter o limite do tipo de dados que tu está usando pro bagulho, basta saber calcular corretamente como aplicar um número como uma parte em uma certa posição de um número maior. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Fevereiro 21, 2009 É veio, tem algo de errado aqui, fiz uma função pra verificar os repetidos e encontrou um monte...não sei o que tá acontecendo, tá td definido como unsigned long int e to usando tipo valor 10000 e já aparece repetido, então não tá estorando...acredito que seja algum problema na geração dos números aleatórios msm "/ Não consegui entender oq você quis dizer nessa última linha... Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Fevereiro 21, 2009 Fazer um teste aqui, já já edito... EDIT: Código utilizado: #include <stdio.h> #include <time.h> #define MAX 100 int numeros[MAX]; void checa_repetidos(); int repetido(int numero); int main() { srand(time(NULL)); int x, mil, cem; for(x=0; x<MAX; x++) { mil = (rand() % 501) * 1000; cem = rand() % 1000; numeros[x] = mil + cem; printf("%d\n", numeros[x]); } checa_repetidos(); getchar(); return 0; } void checa_repetidos() { int x; int repetidos = 0; for(x = 0; x < MAX; x++) { repetidos += repetido(numeros[x]); } printf("qtd de numeros repetidos: %d\n\n", repetidos); } int repetido(int numero) { int x; int conta = -1; for(x=0; x < MAX; x++) { if(numero == numeros[x]) { conta++; } } if(conta > 0) { printf("numero %d repetido %d vezes\n", numero, conta); } return (conta > 0); } Deve ser algum problema na configuração do seu compilador acredito. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Fevereiro 21, 2009 Agora tente alterar o valor da constante MAX para 100000 e teste novamente. Uma coisa, porque a tua variável conta, na função repetido(int numero) começa com -1? Falouu Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Fevereiro 24, 2009 Groove - Por que, com certeza a função repetido vai encontrar um número igual ao número passado nos parametros.... por exemplo: vamos supor que eu tenho um array assim: 30 67 1 34 2 5 75 37 se eu chamar a função: repetido(5), ela percorrerá todo o array em busca de um número 5, e vai encontrar uma ocorrência!! porém só será considerado repetições se encontrar 2 ou mais vezes... a função também seria válida assim: int repetido(int numero) { int x; int conta = 0; for(x=0; x < MAX; x++) { if(numero == numeros[x]) { conta++; } } if(conta > 1) { printf("numero %d repetido %d vezes\n", numero, conta); } return (conta > 1); } Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Março 1, 2009 Não tinha atentado para este detalhe :D Mas alterei meu código e mesmo assim ta acusando repetidos...se coloca mais de 1500 registros já da pau "/ Veja minha função: void VerificaRepetido(unsigned long int *v,unsigned long int max) { unsigned long int i,j; unsigned long int cont = 0; for(i=0;i<max-1;i++) { for(j=i+1;j<max;j++) { if(v[i] == v[j]) { cont++; } } } if(cont > 1) printf("\nNumeros repetidos: %d",cont); else printf("\nNao existem numeros repetidos!"); } Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Março 6, 2009 Alguém testa aí pra ver se tem o mesmo resultado :D Compartilhar este post Link para o post Compartilhar em outros sites