numero aleatorio

NeB1

#12 si, el tuyo también es muy bueno no me había fijado xDD sorry :P has exo lo q tendría que ser lo primero q se le ocurriese a un buen programador, y lo q a dixo el otro lo segundo cuando ya se lo ha replanteado.

LioNHearT

tengo una nueva duda, haber como lo veis. al final utilice este codigo (si, el poco eficiente xD):

int  aleatori (){
     int x,un,dec,cent,mil;
     bool genera=false;
     srand(time(NULL));
     while(!genera){
     x=rand()%10000;
     un=x%10;
     dec=(x/10)%10;
     cent=(x/100)%10;
     mil=(x/1000)%10;
     if((un!=dec && un!=cent && un!=mil) &&
     (dec!=un && dec!=cent && dec!=mil) &&
     (cent!=un && cent!=dec && cent!=mil) &&
     (mil!=un && mil!=dec && mil!=cent))
     genera=true;
     }
    return x;
     }

la funcion va bien, me genera un numero aleatorio de 4 cifras diferentes. el problema está en que a veces me lo genera de 3 cifras y nose porque. teneis alguna idea?

MaKi

Tu función cumple su función valga la redundancia, pero como dices, no es NADA eficiente, por ejemplo:

en el if tienes exactamente 6 condiciones redundantes, por ejemplo:

un!=dec && dec!=un
etc ...

Pero las comparaciones de numeros estan muy optimizadas y no es grabe, pero la parte de:

x=rand()%10000;
un=x%10;
dec=(x/10)%10;
cent=(x/100)%10;
mil=(x/1000)%10;

Esa parte da un poco de miedo xD y tampoco esta tan mal porque solo haces 1 rand() pero es ilegible.

Por eso si ya pasas de eficiencia, te da igual, pues por lo menos haz algo legible y facil de leer y entender. Prueba esto, modificado del tuyo.

int aleatorio_10000_unico()
{
	int x,un,dec,cent,mil;
	bool genera=false;
	srand(time(NULL));
	while(!genera)
	{
		un=rand()%10;
		dec=rand()%10;
		cent=rand()%10;
		mil=rand()%10;
		if	(
				(un!=dec && un!=cent && un!=mil) &&
				(dec!=cent && dec!=mil) &&
				(cent!=mil)
			)
		{
			genera=true;
			x = mil*1000 + cent*100 + dec*10 + un;
		}
	}
	return x;
}

Tu haces:
1 rand
4 operaciones costosas para extraer unidades
Hacer tropecientas comparaciones que sobran la mitad

Yo:
4 rand que me dan las 4 unidades
1 operacion costosa que las junto en 4 cifras
Hagos las comparaciones justas y necesarios.

Realmente lo de las comparaciones es un error tuyo, pero lo del rand pues no se puede saber que algoritmo es más rápido de los 2, habría que hacer benchmark.

Aziwar

mmm justo iba a hacer una pregunta sobre esto y veo el post xD

Hablando en pascal...

  • Random genera número aleatorio
  • Randomize inicializa el generador de números aleatorios
  • Pero...que hace el RandSeed?? es que todavía no lo pillo, por que le veo la misma función que el Randomize
elkaoD

#31 no te preocupes que era broma xD Pero gracias :)

#32, si el numero de los millares es un 0, el número te sale de tres cifras. Para ver el 0 de la izquierda puedes hacer un (s)printf con "%04d" como formato, para que siempre imprima una cadena de 4 cifras, aunque el entero sea menor.

NeO_PedritO

#34 Con una misma semilla se genera la misma secuencia de numeros aleatorios siempre.

Randomize vuelve a inicializar esa secuencia, de forma que se repetiran los valores aleatorios de nuevo, desde el principio (esto lo supongo, pero no estoy seguro ya que nunca lo he usado).

En cambio el randseed te cambia la semilla, pudiendo generar secuencias diferentes totalmente.