PDA

Visualizza la versione completa : [C++] Generare lettere alfabetiche casuali (random)


Doch88
31-03-2010, 19:51
Ciao a tutti, sono un pò inesperto e volevo chiedervi una semplice cosa: come faccio a generare delle lettere random in base all'ordine alfabetico? Ho provato con queste funzioni:

srand(static_cast<int>(time(NULL)));
rand() % 26 + 1;
poi altro codice che faceva sì che se aveva 0 era uguale ad "a", se aveva 1 era uguale a "b" etc... ma non mi funziona, mi genera delle lettere o dei caratteri ASCII che non centrano niente come come questo: "Ö";

Mi potete aiutare?
Grazie in anticipo,
Doch

MItaly
31-03-2010, 19:54
rand()%26+'a'

Doch88
31-03-2010, 20:10
Allora non era quello il problema, il mio progetto era quello di creare una specie di generatore di password casuale ecco il codice(modificato con quello che mi hai detto):


#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <windows.h>

#define random(x) rand() % x
#define randomize srand((unsigned)time(NULL))

using namespace std;

char password[256];
int num_l_min;
int num_l_rag; //Inizia dal numero 1

void generator();

int main(int argc, char *argv[]){
generator();
}

int casnum(){
Sleep(2000);
char chnum;
int numero;
randomize;
numero = random(100);
cout << "Number of number = " << numero << "\n";
return numero;
}
char caschar(){ //Caratteri casuali
char carat;
Sleep(2000);
randomize;
carat = rand() % 26 + 'a';
cout << "char = " << carat << "\n";
return carat;
}
bool casbool(){ //Boolean Casuali
bool casual;
int numerocas;
Sleep(2000);
int maiusc;
randomize;
numerocas = random(2);
if(numerocas == 1)
casual = true;
else
casual = false;
return casual;
}
void genera(int num_l_rag, int num_l_min, char password[]){ //Generazione Password
while(num_l_min >= num_l_rag){
cout << " - " << num_l_rag << "\n";
if (casbool() == true){
cout << "true = number\n";
password[num_l_rag] = casnum();
cout << "\n--END--\n";
}else{
cout << "false = char\n";
password[num_l_rag] = caschar();
cout << "\n--END--\n";
}
num_l_rag++;
}
}
void cinget(){ //cin.get
int undef;
cin >> undef;
}
void generator(){
cout << "Inserisci il numero di caratteri da usare(0 compreso):\n";
cin >> num_l_min;
cout << "Attendi, l'operazione potrebbe richiedere qualche minuto...\n";
genera(num_l_rag, num_l_min, password);
cout << "password generata = " << password << "\n";
cinget();
}


come output mi porta frasi in ascii strane come t♦t (non contate le strani parti di codice che ho aggiunto nel programma XD)

Doch88
31-03-2010, 20:26
Come potrei fare?

antotan
31-03-2010, 21:21
Elegantemente, puoi usare "generate" della STL:



#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

char randChar()
{
return rand() % 26 + 'a';
}

int main()
{
srand(time(NULL));
const int passlen = 8;
char passwd[passlen];

generate(passwd, passwd + passlen, randChar);

cout << passwd << endl;
}



altrimenti ti basta un piccolo ciclo:



#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
srand(time(NULL));
const int passlen = 8;
char passwd[passlen];

for(int i = 0; i < passlen; i++)
passwd[i] = rand() % 26 + 'a';

cout << passwd << endl;
}


nota che la "srand" non la chiamo prima di ogni "rand". Quando chiami la srand e gli indichi il seme, i numeri generati poi saranno basati su quel seme. Non hai bisogno ogni volta di indicare un nuovo seme.

:ciauz:

MItaly
01-04-2010, 14:37
Anche perché se no, se il ciclo viene ripetuto più volte al secondo, ottieni sempre lo stesso carattere.

Doch88
01-04-2010, 14:59
Sembra che ora vada bene,
grazie mille per l'aiuto! :D

:ciauz:

Loading