2015-09-29 2 views
0

Итак, моя цель - создать случайный генератор паролей длины n (n> = 5 & & n < = 15), который добавляет только два номера в случайных местах.Расчет процентного процента

(например 7S4js 86dJxD h6Zqs9K)

У меня это работает ... или я так хочу верить. Я хочу знать, будет ли мой код ВСЕГДА работать при определении того, нужно ли вводить число.

'newPassword': Возвращает строку длины 'len', используя номера nums.

std::string newPassword(int len, int nums) 
{ 
    std::string password = ""; 

    // Required numbers 
    int req = nums; 

    for (int i = 0; i < len; i++) 
    { 
     bool needNum = req > 0; 

     bool chance = rand() % len > req; 

     bool useNum = needNum && chance; 

     if (useNum) 
      req--; 

     char c = nextChar(useNum); 

     password += c; 
    } 

    return password; 
} 

'nextChar': Возвращает случайный символ. Символ будет числом, если «isNum» истинно.

char nextChar(bool isNum) 
{ 
    char c; 

    if (!isNum) 
    { 
     // 50% chance to decide upper or lower case 
     if (rand() % 100 < 50) 
     { 
      c = 'a' + rand() % 26; 
     } 
     else 
     { 
      c = 'A' + rand() % 26; 
     } 
    } 
    else 
    { 
     // Random number 0-9 
     c = '0' + rand() % 10; 
    } 

    return c; 
} 

Так что, будет ли переменная 'шанс' в 'newPassword' работать все время?

ответ

0

rand() - это устаревший и ужасный способ генерации случайных чисел. Заголовок C++ 11 <random> предоставляет гораздо более качественные возможности для работы со всеми видами случайных вещей.

Ваш способ выбора буквы или цифры не всегда будет работать. Я бы подошел к нему по-другому: сгенерировал необходимое количество букв и цифр, а затем перетасовал строку. Это может быть не самый эффективный способ, но, учитывая ваши требования к длине пароля, я бы больше оценил код.

#include <string> 
#include <random> 
#include <algorithm> 

std::string generatePassword(int length, int nDigits) 
{ 
    std::string password; 
    password.resize(length); 

    std::mt19937 generator{std::random_device{}()}; 

    // Generate capital/lowercase letters 
    std::uniform_int_distribution<char> letterGen(0, 2 * 26 - 1); 
    auto digitsBeginIter = std::generate_n(password.begin(), length - nDigits, 
        [&letterGen, &generator]() { 
         auto l = letterGen(generator); 
         return l < 26 ? 'a' + l : 'A' + (l - 26); 
        }); 

    // Generate the digits 
    std::uniform_int_distribution<char> digitGen('0', '9'); 
    std::generate_n(digitsBeginIter, nDigits, 
        [&digitGen, &generator]() { return digitGen(generator); }); 

    // Shuffle the string 
    std::shuffle(password.begin(), password.end(), generator); 

    return password; 
} 
Смежные вопросы