Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182

    [c++] mescolare in modo casuale e senza ripetizioni array char

    Mi serve una funzione per mescolare in modo casuale le lettere di una parola contenuta in un array di char.. Il problema è che non deve ripetere le stesse lettere, però in caso di ripetizione della parola stessa si!
    ho provato a fare questo:

    codice:
    void permutaprima(char a[]){
         
         int size=strlen(a);
         int casuale=1+rand()%size;
         for(int i=0; i<size;i++){
                 c[i]=a[casuale];
    }
    
    }
    questo però mi genera numeri anche ripetuti!
    spiego meglio cosa deve fare la funzione:
    ad esempio se ho la parola casa deve mescolarmi le lettere senza ripetizioni: asca ad esempio..o csaa ecc...
    con parole tipo farfalla deve fare la stessa cosa ma calcolando che ci sono due l

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Up

  3. #3
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    La mia idea è non di generare direttamente una permutazione della stringa, ma di prendere la stringa e di effettuare un certo numero di scambi dei suoi elementi.Il criterio con cui scambiarli è casuale.
    Ho scritto una funzione:
    codice:
    void permutazione(char *s)
    {
        int i,min,random_1,random_2;
        srand(time(NULL));
        min=(strlen(s)-1)/2;
        for(i=0;i<N;i++)
        {
            random_1=rand()%min;
            random_2=rand()%min;
            random_2+=min;
            cswap(&s[random_1],&s[random_2]);
        }
    }
    Dove N è una costante ed è il numero di scambi che si vuole effettuare.
    cswap è una funzione per scambiare caratteri.
    Per evitare che random_1 e random_2 abbiano gli stessi valori, ho fatto assumere a random_1 i valori che vanno da inizio stringa a metà stringa, e a random_2 i valori successivi, per poter generare una permutazione anche con un N molto piccolo.

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Mi sono dimenticato di dire che con questo criterio se la stringa ha cardinalità dispari, l' ultima lettera rimane sempre immutata.
    Per cui in mezzo al ciclo bisogna aggiungere:
    codice:
    if(((strlen(s)-1)%2)==1)
                random_2+=rand()%2;

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Originariamente inviato da ramy89
    La mia idea è non di generare direttamente una permutazione della stringa, ma di prendere la stringa e di effettuare un certo numero di scambi dei suoi elementi.Il criterio con cui scambiarli è casuale.
    Ho scritto una funzione:
    codice:
    void permutazione(char *s)
    {
        int i,min,random_1,random_2;
        srand(time(NULL));
        min=(strlen(s)-1)/2;
        for(i=0;i<N;i++)
        {
            random_1=rand()%min;
            random_2=rand()%min;
            random_2+=min;
            cswap(&s[random_1],&s[random_2]);
        }
    }
    Dove N è una costante ed è il numero di scambi che si vuole effettuare.
    cswap è una funzione per scambiare caratteri.
    Per evitare che random_1 e random_2 abbiano gli stessi valori, ho fatto assumere a random_1 i valori che vanno da inizio stringa a metà stringa, e a random_2 i valori successivi, per poter generare una permutazione anche con un N molto piccolo.
    ma cosi non capita che una lettera venga ripetuta? Com è la funzione cswap?

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Fa questo:
    mescolare in modo casuale le lettere di una parola contenuta in un array di char
    Se la parola è "ciaoc" una possibile permutazione è "ciaoc".
    Non mi sembra ambigua la cosa.

    La funzione cswap scambia caratteri, eccone un esempio:
    codice:
    void cswap(char *a, char *b)
    {
        char temp;
        temp=*a;
        *a=*b;
        *b=temp;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.