rand



  • SideWinder schrieb:

    Du überprüfst zwar, ob die Zahl bereits einmal vorgekommen ist - falls ja generierst du eine neue Zahl: Was aber wenn diese nun ebenfalls bereits vorkommt?

    darum sollte ja j=0 die überprüfung neu starten

    BTW: Es hat nicht gerade viel Sinn was du hier machst. Wenn es dir einfach darum geht, dass die Zahlen 1-8 in einer zufälligen Reihenfolge im Array sind dann schreib sie ins Array und mische sie danach.

    gute idee weiss zwar noch nicht wie aber ich denke nach



  • hab mal über deinen vorschlag nachgedacht....

    jedoch:

    int main(void)
    {   
        int r,i,j,k,l;
        char farben[8]={1,2,3,4,5,6,7,8};
        srand(time(0));
        for(r=0;r<100;r++)
        {
         i = farben[j=rand()%8];
         k = farben[l=rand()%8];
         farben[l]=i;
         farben[j]=k;
        }
        for (i=0;i<8;i++) 
        {      
          printf("Zahl %d: %d\n",i,farben[i]);     
        } 
    
      getch();	
      return 0;
    }
    

    Geht das nicht eleganter??? 😮



  • weiss wer was eleganteres oder soll ich das so verwenden wie es meiner kranken phantasie entsprungen ist?? 😃

    ich denke mir nämlich dass ich zu viele veriablen brauche... 🤡



  • Pseudocode:

    for (i = n; i > 0; i--)
      swap(a[n], a[rand(i)]);
    

    erzeugt dir eine beliebige Permutation deiner Ausgangsfolge. rand(n) ist hierbei eine zufällige Zahl zwischen 1 und n. swap erklärt sich glaube ich von selbst. Du müßtest dein Array nur mit den Zahlen 1 bis n initialisieren 😉



  • für die schleifen kannste eine variable nehmen, den tausch mit xor-swap machen. dann hast du weniger variablen, aber was bringt das?
    🙂



  • fricky schrieb:

    für die schleifen kannste eine variable nehmen, den tausch mit xor-swap machen. dann hast du weniger variablen, aber was bringt das?
    🙂

    hi,
    guck mal unter
    Reasons for avoidance in practice
    http://en.wikipedia.org/wiki/XOR_swap_algorithm



  • curb schrieb:

    SideWinder schrieb:

    Du überprüfst zwar, ob die Zahl bereits einmal vorgekommen ist - falls ja generierst du eine neue Zahl: Was aber wenn diese nun ebenfalls bereits vorkommt?

    darum sollte ja j=0 die überprüfung neu starten

    Schon, aber in
    [quote="Curb"]

    ...
            for(j=0;j<i;j++)                
            {
    ...
                   j=0;                                   
             }
    

    wird j (nach Beendigung des Schleifendurchlaufs) ja gleich wieder auf 1 gesetzt.



  • Danke für eure tipps !!
    👍



  • curb schrieb:

    Danke für eure tipps !!
    👍

    und wie hast du es jetzt gemacht, zeig doch mal den code!



  • ich mach es jetzt so...

    void mischen(int* zahl)
    {   
    
        srand(time(0));
        int i,temp,t;
        for (i = 100; i > 0; i--) 
          { 
            t= rand()%8;    
            temp = zahl[0];
            zahl[0] =  zahl[t];
            zahl[t] = temp;
          }
    }
    

    da ich von swap nichts finde und es besser aussieht als meine erste mischfunktion...(konstruktive kritik ist aber immer erwünscht)
    obwohl ich sagen muss, mit der lösung bin ich ganz zu frieden..



  • ps:

    ich könnte die schleife auch auf <8 verkürzen und statt zahl[0] auch zahl[i] verwenden...spreche ja von einem array[8]...



  • curb schrieb:

    ps:

    ich könnte die schleife auch auf <8 verkürzen und statt zahl[0] auch zahl[i] verwenden...spreche ja von einem array[8]...

    Genauso meinte ich es auch. 100 mal brauchst du das nicht zu durchlaufen. Ich habe es eben mit folgendem Code getestet.

    void mischen(int* zahl) {  
    
        srand(time(0));
        int temp, t;
        for (int i = 8; i > 0; i--) {
            t = rand() % i;
            temp = zahl[i - 1];
            zahl[i - 1] = zahl[t];
            zahl[t] = temp;
        }
    }
    


  • hab da mal nur ein anderes problem das ich nicht verstehe..

    ich hab das auf char umgeschrieben...

    void mischen(char* zahl)
    {   
    
        srand(time(0));
        int i;
        char temp,t;
        for (i = 100; i > 0; i--) 
          { 
            t= rand()%8;    
            temp = zahl[0];
            zahl[0] = zahl[t];
            zahl[t] = temp;
          }
    }
    

    und in der main:

    int main(void)
    {   
        int i;
    
        char zahl[8]={1,2,3,4,5,6,7,8};
        char ein[8];
    
        mischen(zahl);
    
        for (i=0;i<8;i++)
        {
          printf("%d",zahl[i]);
        }
    }
    

    warum muss ich hier %d verwenden um meine zahlen ordentlich zu sehen bei einem char array??? denn bei %c oder %s kommt schwachsinn raus 😕



  • ah sorry hab bemerkt, dass \0 fehlt im string bei der definition...

    glaub das ist das problem



  • Habs nicht ausprobiert, aber es könnte durchaus daran liegen, daß das t ein int bleiben sollte 😉



  • ich denke es ist im prinzip egal ob t ein integer oder ein char is...



  • Es ist im Prinzip auch egal. Aber der "Schwachsinn" könnte damit zusammenhängen, daß du Zahlen 1-8 bearbeitest was ja den ASCII-Codes des "Schwachsinns" entspricht 😉


Anmelden zum Antworten