Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gRoOvE

Números grandes..

Recommended Posts

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

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

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

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

É 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

É 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

Fazer um teste aqui, já já edito...

 

EDIT:

Imagem Postada

 

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

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

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

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

Alguém testa aí pra ver se tem o mesmo resultado :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.