Quiero escribir un programa para que me imprima 10 números aleatorios cada vez que lo ejecuto, los números aleatorios de la impresión debe ser de 1 a 10, también deben nunca se repita.

ACTUALIZACIÓN:lo Siento por no indica que el problema exacto, básicamente, el bucle while, que se supone que debe volver a asignar los números aleatorios sólo si no se puede apostar sido utilizado está causando mi programa no imprime nada en absoluto. Si un comentario de todo el bucle while y dejar el printf en la parte inferior se imprime 10 números aleatorios entre 1 a 10, sin embargo sólo se imprime repite.

Podría alguien decirme cómo puedo arreglar mi código o darme algunos consejos?

#include <stdio.h>
#include <time.h>

int main()
{
int array[10];
int x, p;
int count;
int i=0;

srand(time(NULL));

for(count=0;count<10;count++){
array[count]=rand()%10+1;
}

while(i<10){
int r=rand()%10+1;

for (x = 0; x < i; x++)
{
if(array[x]==r){
    break;
}
if(x==i){
    array[i++]=r;
}
}

}
for(p=0;p<10;p++){
printf("%d ", array[p]);
}
return 0;
}
  • Búsqueda de Linear Feedback Shift Registers (LFSR) o Pseudo Random Number Generator (PRNG)
  • También en el código, puede utilizar srand() antes de la segunda rand() también.
  • Por favor, mencionar el problema que está experimentando.
  • Lo siento, actualizado.
InformationsquelleAutor Titan | 2014-04-25

3 Comentarios

  1. 0

    if(x==i) nunca puede ser verdad en el interior de la for (x = 0; x < i; x++) bucle, por lo tanto
    el while bucle de nunca terminar.
    La declaración de si se ha movido después de la for-loop:

    while(i<10){
        int r=rand()%10+1;
    
        for (x = 0; x < i; x++)
        {
            if(array[x]==r){
                break;
            }
        }
        if(x==i){
            array[i++]=r;
        }
    }

    También el primer bucle

    for(count=0;count<10;count++){
        array[count]=rand()%10+1;
    }

    es innecesario, ya que los valores se sobrescriben más tarde.

    (Si usted mira para arriba «permutación aleatoria» o «de Fisher–Yates shuffle»
    a continuación, usted encontrará más algoritmos eficientes para la producción de un no-repetición de la secuencia
    de números aleatorios.)

  2. 1

    Mediante un cambio de máscara de algoritmo, puede generar números pseudo-aleatorios, que no se repiten. He incluido uno de mis funciones, dando un ejemplo de esto, a continuación. Este proceso es 10 veces más rápido que cualquier otro ofrecido por el algoritmo, también utiliza ningún extra de memoria. Este tipo de algoritmo se utiliza normalmente para «digital disolver» y «dispersión» de efectos, etc., sin embargo, mi aplicación se centra en un solo efecto dimensional.

    Disfrutar,
    El Dr. B

    /* Bryan Wilcutt's random scatter algorithm */
    /* Generates random-appearing, non-repeating values. */
    
    /* Can be any number within the given range of 32K 
       Mask must be changed for other ranges.  */
    
    #define START_POINT 1
    
    void randScatter()
    {
        long mask;  /* XOR Mask */
        unsigned long point;
        int val;
        unsigned int range = 0x7fff; /* 32K */
    
        mask = 0x6000; /* Range for 32K numbers */
    
        /* Now cycle through all sequence elements. */
    
        point = START_POINT;
    
        do {
            val = point % range;    /* Get random-appearing value */
            printf("%08x\n", val);
    
            /* Compute the next value */
    
            if (point & 1) {
                /* Shift if low bit is set. */
    
                point = (point >> 1) ^ mask;
            } else {
                /* XOR if low bit is not set */
    
                point = (point >> 1);
            }
        }  while (point != START_POINT); /* loop until we've completed cycle */
    }
  3. 0

    (1) Su sangría que está mal. La correcta sería:

    #include <stdio.h>
    #include <time.h>
    
    int main()
    {
    int array[10];
    int x, p;
    int count;
    int i=0;
    
    srand(time(NULL));
    
    for(count=0;count<10;count++){
    array[count]=rand()%10+1;
    }
    
    while(i<10){
    int r=rand()%10+1;
    
    for (x = 0; x < i; x++)
    {
    if(array[x]==r){
        break;
    }
    if(x==i){
        array[i++]=r;
    }
    }
    
    }
    for(p=0;p<10;p++){
    printf("%d ", array[p]);
    }
    return 0;
    }

    (2) una Vez que la sangría es correcta, es más fácil ver el problema. El if(x==i) parte debe estar dentro de la while pero fuera de la for.

    #include <stdio.h>
    #include <time.h>
    
    int main()
    {
        int array[10];
        int x, p;
        int count;
        int i=0;
    
        srand(time(NULL));
    
        for(count=0;count<10;count++){
            array[count]=rand()%10+1;
        }
    
        while(i<10){
            int r=rand()%10+1;
    
            for (x = 0; x < i; x++)
            {
                if(array[x]==r){
                    break;
                }
            }
            if(x==i){
                array[i++]=r;
            }
        }
        for(p=0;p<10;p++){
            printf("%d ", array[p]);
        }
        return 0;
    }

    Imprime el resultado correcto.

    (3) ahora Se puede quitar el for(count=0;count<10;count++) parte que se llena la matriz con las repeticiones. Su resultado es sobrescrito por la otra parte.


    Una moralización nota: el formato correcto en realidad ayuda a detectar el error. No es el abandono.

Dejar respuesta

Please enter your comment!
Please enter your name here