【发布时间】:2021-07-08 04:41:36
【问题描述】:
我正在尝试创建一个随机密码生成器。当我多次调用该函数时,它返回相同的字符值。 QQpQ;7Q7pQ;p
我尝试在我的主函数中添加srand(time(0)); 或srand((unsigned int) time(NULL));。
查看其他 stack 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 passwordLength = 12;
string password = randomGenerator(passwordLength);
cout << password << endl;
return 0;
}
string randomGenerator(int numberOfCharacters){
char randomCharacterTypes[4] = {randomLowerCharacter(),randomInt(), randomCapitalCharacter(), randomSpecialCharacter()};
std::string password;
while (numberOfCharacters > 0){
int random = rand()%4;
password += randomCharacterTypes[random];
numberOfCharacters--;
}
return password;
}
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);
}
【问题讨论】:
-
randomCharacterTypes[4]只包含 4 个不同的字符,您的意思是创建一个函数指针数组吗? -
当我运行你的代码时,第一次打印
RReR>>eReR6e,第二次打印g>g>7gTgg>>T是不是因为你在同一秒内运行了不止一次?这将给出相同的值,因为 time(NULL) 返回一个整数秒 - 所以如果你在同一秒内多次运行它 time(NULL) 将返回相同的值。 -
由于您使用的是 c++11,因此您应该停止使用 srand 以支持新的随机数生成器:stackoverflow.com/a/66850447/1294207
-
@AlanBirtles 哦,我明白了,我正在尝试使用函数指针。我看到如果我只是调用 randomLowerCharacter();它确实返回一个随机字符值。我将研究如何实现函数指针。谢谢!!!
-
如果你在代码中写
'a'而不是97,你可以避免像//97 = a这样的cmets(其他字符也类似)..