计算概率百分比

Calculating percent chance

本文关键字:百分比 概率 计算      更新时间:2023-10-16

所以我的目标是创建一个长度为n (n>= 5)的随机密码生成器&&N <= 15),只在随机位置加两个数字。

(如。

我有这个工作…至少我是这么想的。我想知道的是,我的代码是否总是在确定是否应该插入一个数字时工作。

'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'工作所有的时间?

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;
}