Generazione stringhe casuali

di il
29 risposte

Generazione stringhe casuali

Voglio generare una stringa composta da caratteri casuali.
Deve contenere solo lettere maiuscole e minuscole, e numeri.

char stringa[10];

srand(1);
for(i = 0; i < 10; i++)
{
  stringa[i] = ?????
}
cosa metto al posto di ??? Come posso fare? Grazie.

29 Risposte

  • Re: Generazione stringhe casuali

    L'intervallo ASCII di cifre, lettere maiuscole e minuscole va da

    48 a 122

    quindi devi generare con rand un valore tra questi limiti (fai tu).

    POI DEVI CONTROLLARE e NON devi accettare il valore se ricade negli intervalli

    58-64 OPPURE 91-96

    e ripetere l'estrazione.
  • Re: Generazione stringhe casuali

    Do
    stringa = 48 + rand() %(122-48);
    while
    stringa = ????
    Così ? come lo faccio il controllo?
  • Re: Generazione stringhe casuali

    Usa i tag CODE per il codice ... il controllo si fa con delle if ...
  • Re: Generazione stringhe casuali

    #include <iostream>
    #include <ctime>//time.h se c
    #define N 100 //dimesione array e ciclo
    
    using namespace std;
    
    int main()
    {
        srand(time(NULL));//assegna nullo al codice per generare un sempre differente numero
        char casuale, stringa[N];
        for(int i=0;i<N;)
        {
            casuale=rand()%123; //numeri da generare 122+1
            if(casuale>=48&&casuale<=57) //primo controllo
            {
                stringa[i]=casuale;//assegna il valore
                cout<<stringa[i];//stampa senza endl per non creare un altro ciclo
                i++;//aumenta i per il ciclo for
            }
            if(casuale>=65&&casuale<=90) // secondo controllo
            {
                stringa[i]=casuale;//assegna il valore
                cout<<stringa[i];//stampa senza endl per non creare un altro ciclo
                i++;//aumenta i per il ciclo for
            }
            if(casuale>=97&&casuale<=122) //terzo controllo
            {
                stringa[i]=casuale;//assegna il valore
                cout<<stringa[i];//stampa senza endl per non creare un altro ciclo
                i++;//aumenta i per il ciclo for
            }
        }
        return 0;
    }
  • Re: Generazione stringhe casuali

    A parte il fatto che il codice che hai proposto è ridondante (ma non conosci la or || ?), non fai un buon servizio a nessuno nel forum non facendo riflettere sul problema chi l'ha proposto e fornendo codice scadente che viene proposto ai professori dagli studenti.

    Non è un comportamento produttivo ... affatto.
  • Re: Generazione stringhe casuali

    oregon ha scritto:


    A parte il fatto che il codice che hai proposto è ridondante (ma non conosci la or || ?), non fai un buon servizio a nessuno nel forum non facendo riflettere sul problema chi l'ha proposto e fornendo codice scadente che viene proposto ai professori dagli studenti.

    Non è un comportamento produttivo ... affatto.
    Scusami, alla fine ho tirato fuori un codice del genere :
    
     for (j = 0;
          j < 10;
           j++)
    {  
       do
       stringa[j] = 48 + rand() % (123 - 48); 
       while ((stringa[j] >= 58 && stringa[j] <= 64) || (stringa[j] >= 91 && stringa[j] <= 96));
          }
    
    Sembra funzionare. Spero di aver "coinvolto" tutti i caratteri alfanumerici.
    Nell'espressione "48 + rand() % (123 - 48), va il 123 come ho messo io o dovrei mettere il 122?
    Grazie per la pazienza
  • Re: Generazione stringhe casuali

    Sì, la forma generica è

    min + rand() % (max + 1 - min);

    quindi se min ?48 e max = 122

    allora hai scritto correttamente e va bene 123

    Questo codice è molto più elegante ...
  • Re: Generazione stringhe casuali

    oregon ha scritto:


    Sì, la forma generica è

    min + rand() % (max + 1 - min);

    quindi se min ?48 e max = 122

    allora hai scritto correttamente e va bene 123

    Questo codice è molto più elegante ...
    Okay grazie mille!
  • Re: Generazione stringhe casuali

    Oppure non volendo andare a tentativi:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main()
    {
        srand(time(0));
        for(unsigned int i = 0; i < 50; ++i)
        {
            int r = rand() % 62;
            char c = r + '0' + (r > 9) * 7 + (r > 35) * 6;
            printf("%c\n", c);
        }
        return 0;
    }
  • Re: Generazione stringhe casuali

    Perche' cercare complicazioni?
  • Re: Generazione stringhe casuali

    Nippolo ha scritto:


    Oppure non volendo andare a tentativi:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main()
    {
        srand(time(0));
        for(unsigned int i = 0; i < 50; ++i)
        {
            int r = rand() % 62;
            char c = r + '0' + (r > 9) * 7 + (r > 35) * 6;
            printf("%c\n", c);
        }
        return 0;
    }
    Questa non la sapevo, la condizione (r>9), genera solato 1 o uno 0, giusto ?
  • Re: Generazione stringhe casuali

    TheorLaw ha scritto:


    Questa non la sapevo
    Cosa non sapevi?
    la condizione (r>9), genera solato 1 o uno 0, giusto ?
    Certamente
  • Re: Generazione stringhe casuali

    oregon ha scritto:


    TheorLaw ha scritto:


    Questa non la sapevo
    Cosa non sapevi?
    la condizione (r>9), genera solato 1 o uno 0, giusto ?
    Certamente
    se invece devo generare casualmente un numero compreso tra 0 e 3n (dove n è un valore preso da tastiera) la seguente espressione è corretta? :
    
    valore = 1 + rand() % (3*n);
    
  • Re: Generazione stringhe casuali

    Rifletti ... se 3n valesse 300 come faresti a generare un numero compreso tra 0 e 300 ?
Devi accedere o registrarti per scrivere nel forum
29 risposte