大佬教程收集整理的这篇文章主要介绍了如何在同一个 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);
}
感谢@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,请注明来意。