Zufallszahl erzeugen, wobei jede Ziffer nur einmal vorkommen darf



  • Ich versuche gerade, die Zahl wie sie im Titel beschrieben wird zu erzeugen.
    Leider hab ich jeden klaren Gedanken verloren wie ich das hinbekomme und hoffe ihr könnt mir Tipps geben.

    int i, j, zahl, anzz;
        int zufall[10] = {0};
    
        srand((unsigned) time(NULL)) ;
    
        printf("ZUFALLSZAHL\n\n");
        printf("Anzahl Ziffern (5 - 10): ");
        scanf("%d", &anzz);
    
        for(i = 0; i < anzz; i++)
              {
              zahl = (rand() % 10);
              for(j = 0; j < i; j++);
                    {
                    if(zufall[j] == zahl)
                            {
                            // ?????
                            zufall[i] = zahl;
                            }
                    }
              zufall[i] = zahl;
              printf("%d", zufall[i]);
              }
        printf("\n");
    

    Der Hans



  • Also entweder ich verstehe das grad falsch, oder du fügst eine Ziffer immer nur dann hinzu, wenn sie schon mal vorkommt (was das Gegenteil von dem wäre, was du willst).

    if(zufall[j] == zahl)
    

    Außerdem musst du doch erneut rand aufrufen, wenn eine Ziffer bereits vorkommt. Du machst aber nur anzz Durchläufe.

    P.S.: cpp- statt code-Tags benutzen!



  • _matze schrieb:

    Also entweder ich verstehe das grad falsch, oder du fügst eine Ziffer immer nur dann hinzu, wenn sie schon mal vorkommt (was das Gegenteil von dem wäre, was du willst).

    if(zufall[j] == zahl)
    

    Außerdem musst du doch erneut rand aufrufen, wenn eine Ziffer bereits vorkommt. Du machst aber nur anzz Durchläufe.

    P.S.: cpp- statt code-Tags benutzen!

    Falls "zahl" irgendwo bereits vorkommt, dann wird sie ausgetauscht.



  • wie sieht das mit dem wertebereich der zahlen aus? aus wie vielen zahlen soll zufällig gewählt werden?



  • Es sollen 5 bis 10 Ziffern ausgegeben werden und die sollen eine Zahl bilden.



  • ja, ok. und in welchem bereich? von-bis?



  • zzuuffaall schrieb:

    ja, ok. und in welchem bereich? von-bis?

    Überleg mal...



  • Hi!

    Guckst du hier:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define N 10
    
    int arr [N] = {0,1,2,3,4,5,6,7,8,9};
    
    void swap ( int* a, int* b )
    {
    	int c;
    	if ( *a == *b )
    		return;
    	 c = *b;
    	*b = *a;
    	*a = c;
    }
    
    int irand ( int a, int b )
    {
    	double r = b - a + 1;
        return a + (int)( r * rand() / (RAND_MAX+1.0) );
    } 
    
    void mix ()
    {
    	int n = N;
    	while ( n-- > 0 )
    		swap ( &arr[n], &arr[irand(0,n)] );
    }
    
    void view ( int n )
    {
    	int i = 0;
    	while ( i < N && i < n )
    		printf ("%d", arr [i++] );
    }
    
    int main ()
    {
    	int anzahl = 7; // ca. 5-10 ziffern ;)
    	srand((unsigned)time( NULL ));
    	mix ();
    	view ( anzahl );
    }
    

    Gruß,
    B.B.


Anmelden zum Antworten