elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Aporte] Numeros Enteros NO repetidos y pseudo-aleatorios (en desorden)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Aporte] Numeros Enteros NO repetidos y pseudo-aleatorios (en desorden)  (Leído 2,221 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
[Aporte] Numeros Enteros NO repetidos y pseudo-aleatorios (en desorden)
« en: 11 Junio 2016, 18:39 pm »

Muy buen dia les dejo un funcion que devuelve una arreglo de numeros enteros no repetidos y pseudo-aleatorios.


Código
  1. int *aleatorios_no_repetidos(int max) {
  2. char *no_repetidos = NULL;
  3. int *desorden = NULL;
  4. int r = 0;
  5. register int i = 0;
  6. srand(time(NULL));
  7. while(no_repetidos == NULL){
  8. no_repetidos = calloc(max,sizeof(char));
  9. }
  10. while(desorden == NULL){
  11. desorden = calloc(max,sizeof(int));
  12. }
  13. do {
  14. r = rand() % max;
  15. if(no_repetidos[r] == 0) {
  16. desorden[i] = r;
  17. no_repetidos[r] = 1;
  18. i++;
  19. }
  20. }while(i < max);
  21. free(no_repetidos);
  22. return desorden;
  23. }

Funcion explicada paso a paso:

Código
  1. int *aleatorios_no_repetidos(int max) {
  2. char *no_repetidos = NULL; //Variable auxiliar para determinar si un numero ya fue agregado o no
  3. int *desorden = NULL; //Contenedor con los numeros en desorden y no repetidos
  4. int r = 0; //variable temporal para el numero pseudo-aleatorio
  5. register int i = 0; //contador de numeros en el arreglo desorden
  6. srand(time(NULL)); //inicializamos nuestra funcion random, en otros sistemas se puede utlizar algun otro generador de numeros aleatorios ya que esta implementacion es muy pobre
  7. //Los siguientes ciclos son usados para asignar espacio a no_repetidos, y  desorden respectivamennte se puede omitir el ciclo ya que rara vez calloc devuelve NULL, pero siempre es bueno validar que no exista error en el retorno de calloc
  8. while(no_repetidos == NULL){
  9. no_repetidos = calloc(max,sizeof(char));
  10. }
  11. while(desorden == NULL){
  12. desorden = calloc(max,sizeof(int));
  13. }
  14.  
  15. //El siguiente ciclo do-while es usado para rellenar los numeros mientras i se menor que el numero maximo
  16. do {
  17. r = rand() % max; //Aqui tenemos nuestro numero aleatorio de 0 a max - 1
  18. if(no_repetidos[r] == 0) { //validamos que r no exista en el arreglo de no_repetidos
  19. desorden[i] = r; //Asignamos r al arreglo de desorden
  20. no_repetidos[r] = 1; //agregamos 1 al arreglo de no_repetidos para que el numero r actual no vuelva ser agregado
  21. i++; //incrementamos i solo dentro del if para solo contabilizar los numeros que agregemos
  22. }
  23. }while(i < max);
  24. free(no_repetidos); //Liberamos el arrgelo auxiliar de no repetidos ya que no lo necesitamos mas
  25. return desorden; //regresamos la apuntador a desorden
  26. }


Para usar esta funcion tenemos el siguiente ejemplo:

Código
  1. #include<stdio.h>
  2. #include<time.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5.  
  6. int *aleatorios_no_repetidos(int max);
  7.  
  8.  
  9. int main() {
  10. int maximo = 10;
  11. int *numeros = aleatorios_no_repetidos(maximo); // Solo numeros del 0 al 9  en desorden Los cuales son 10 en total
  12. int i = 0;
  13. printf("Numeros aleatorios no repetidos:\n");
  14. while(i < maximo) {
  15. printf("%i\t",numeros[i]);
  16. i++;
  17. }
  18. printf("\n");
  19. free(numeros);
  20. return 0;
  21. }
  22.  


Salidas de ejemplo:

Código:
Numeros aleatorios no repetidos:
9 6 7 5 3 2 8 0 4 1
Numeros aleatorios no repetidos:
6 8 5 9 7 3 0 1 4 2
Numeros aleatorios no repetidos:
3 7 8 6 2 5 1 9 0 4
Numeros aleatorios no repetidos:
3 7 8 6 2 5 1 9 0 4
Numeros aleatorios no repetidos:
3 7 8 6 2 5 1 9 0 4
Numeros aleatorios no repetidos:
0 6 4 2 1 9 3 5 8 7
Numeros aleatorios no repetidos:
0 6 4 2 1 9 3 5 8 7
Numeros aleatorios no repetidos:
0 6 4 2 1 9 3 5 8 7
Numeros aleatorios no repetidos:
7 5 0 6 1 9 8 2 3 4
Numeros aleatorios no repetidos:
7 5 0 6 1 9 8 2 3 4

Cada 2 lineas es una salida de 10 numeros del 0 al 9 no repetidos y en desorden...

Noten que hay veces que se repite por la pobre implementación de rand() con time(), recomiendo si pueden implementar otra forma de aleatorios estaría mucho mejor el programa.

Proximamente agregare el video explicando el código mencionado.

Saludos



En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines