程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在同一个 srand() 种子中获得两个不同的随机数? C++大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在同一个 srand() 种子中获得两个不同的随机数? C++?

开发过程中遇到如何在同一个 srand() 种子中获得两个不同的随机数? C++的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在同一个 srand() 种子中获得两个不同的随机数? C++的解决方法建议,希望对你解决如何在同一个 srand() 种子中获得两个不同的随机数? C++有所启发或帮助;

我正在尝试创建一个随机密码生成器。当我多次调用该函数时,它返回相同的字符值。 QQpQ;7Q7pQ;p

我尝试在主函数中添加 srand(time(0));srand((unsigned int) time(NulL));

查看其他堆栈 over flow 帖子,我发现每次运行程序时 srand 都有助于创建不同的字符。但是它仍然返回相同字符的倍数。

如何在运行时更改 srand() 种子以获得不同的随机数?

#include <String>
#include <iostream>
#include <time.h>

using namespace std;

String randomGenerator(int numberOfCharacters);
char randomCAPItalCharacter();
char randomLowerCharacter();
char randomSpecialCharacter();
char randomInt();

int main(){
    srand((unsigned int) time(NulL));
    int @R_607_5747@dLength = 12;
    String @R_607_5747@d = randomGenerator(@R_607_5747@dLength);
    cout << @R_607_5747@d << endl;
    return 0;
}

String randomGenerator(int numberOfCharacters){
    char randomCharacterTypes[4] = {randomLowerCharacter(),randomInt(),randomCAPItalCharacter(),randomSpecialCharacter()};
    std::string @R_607_5747@d;

    while (numberOfCharacters > 0){
        int random = rand()%4;
        @R_607_5747@d += randomCharacterTypes[random];
        numberOfCharacters--;
    }
    return @R_607_5747@d;
}
char randomInt(){
    std::string numberAsString = to_String(std::rand()% 10);
    char randomnumberChar = numberAsString.at(0);
    return randomnumberChar;
}
char randomLowerCharacter(){
    return 97 + rand()%26; //97 = a
}
char randomCAPItalCharacter(){
    return 65 + rand()%26; //65 = A
}
char randomSpecialCharacter(){
    /** Special characters are split by numbers so we pick a random from one of the 2 groups.*/
    return (rand()%2) ? char(33 + rand()%14) : char(58 + rand()%8); 
}
  • srand() — why call it only once?
  • Why does rand() yield the same sequence of numbers on every run?

解决方法

感谢@RetiredNinja 指出问题不在于 srand(),而在于我的数组中函数调用不当。使用 switch 语句正确调用函数解决了问题。

//improper calling of functions in an array. Resolved with switch statement below
//char randomCharacterTypes[4] = {randomLowerCharacter(),randomInt(),randomCapitalCharacter(),randomSpecialCharacter()};

while (numberOfCharacters > 0){
    int random = rand()%4;
    switch(random){
    case 0:
        @R_607_5747@d += randomLowerCharacter();
        break;
    case 1:
        @R_607_5747@d += randomInt();
        break;
    case 2:
        @R_607_5747@d += randomCapitalCharacter();
        break;
    case 3:
        @R_607_5747@d += randomSpecialCharacter();
        break;
    }
    numberOfCharacters--;
}
,

randomCharacterTypes 是一个包含 4 个字符的数组,对于每个字符类,您将始终获得相同的字符。如果您想每次都生成一个新字符,则可以改用函数指针:

String randomGenerator(int numberOfCharacters){
    char (*randomCharacterTypes[])() = {randomLowerCharacter,randomInt,randomCapitalCharacter,randomSpecialCharacter};
    std::string @R_607_5747@d;

    while (numberOfCharacters > 0){
        int random = rand()%4;
        @R_607_5747@d += randomCharacterTypes[random]();
        numberOfCharacters--;
    }
    return @R_607_5747@d;
}

randomInt 可以简化为返回 '0''9' 之间的字符,与您的其他函数相同:

char randomInt(){
    return '0' + rand() % 10;
}

如果您使用字符而不是数字,那么您的其他函数将更具可读性,然后您必须添加注释以提醒您它们代表哪个字符:

char randomLowerCharacter(){
    return 'a' + rand()%26;
}
char randomCapitalCharacter(){
    return 'A' + rand()%26;
}
char randomSpecialCharacter(){
    /** Special characters are split by numbers so we pick a random from one of the 2 groups.*/
    return (rand()%2) ? char('!' + rand()%14) : char(':' + rand()%8); 
}

请注意,rand() % x 不是一个好的随机数生成器,您应该改用标准库随机函数(尤其是当您将这些密码用于任何重要的事情时)。

可以使用 String 来进一步简化您的代码以包含您的字符类:

#include <String>
#include <String_view>
#include <iostream>
#include <random>
#include <array>

class @R_607_5747@dGenerator
{
public:
    @R_607_5747@dGenerator()
    {
        for (size_t i = 0; i < characterTypes.size(); i++)
        {
            characterTypeDiStributions[i] = std::uniform_int_diStribution<int>(0,characterTypes[i].size() - 1);
        }
    }

    static constexpr std::array<std::string_view,4> characterTypes = {
            "abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRstuVWXYZ","0123456789","!\"#$%&'()*+,-./:;<=>?@"
        };
    std::array<std::uniform_int_diStribution<int>,characterTypes.size()> characterTypeDiStributions;
    std::uniform_int_diStribution<int> typeDiStribution{0,characterTypes.size() - 1};
    std::mt19937 eng{std::random_device{}()};

    std::string generate(int numberOfCharacters){
        std::uniform_int_diStribution<int> dist{0,5};
        std::string @R_607_5747@d;
        @R_607_5747@d.reserve(numberOfCharacters);
        for (int i = 0; i < numberOfCharacters; i++)
        {
            auto type = typeDiStribution(eng);
            @R_607_5747@d += characterTypes[type][characterTypeDiStributions[type](eng)];
        }
        return @R_607_5747@d;
    }
};

int main(){
    int @R_607_5747@dLength = 12;
    @R_607_5747@dGenerator gen;
    std::string @R_607_5747@d = gen.generate(@R_607_5747@dLength);
    std::cout << @R_607_5747@d << "\n";
    return 0;
}

请注意,此代码可能仍不符合生成密码的高安全标准。

大佬总结

以上是大佬教程为你收集整理的如何在同一个 srand() 种子中获得两个不同的随机数? C++全部内容,希望文章能够帮你解决如何在同一个 srand() 种子中获得两个不同的随机数? C++所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。