所以我在这里为循环工作:
for (int i = 0; i < num; i++) {
for (int i = 0; i < length; i++) {
Str += randGen();
}
cout << Str << endl;
}
}
在上下文中,整数“ length”是随机生成的字符串大小。这是我的randGen()函数:
static const char combination[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
int stringLength = sizeof(combination) - 1;
char randGen() {
return combination[rand() % stringLength];
}
基本上我的问题是,如果'num'大于1,它将为每个相同的部分打印出随机生成的开头部分,并且不会更改。只有当'length'的大小增加时,才出现新的随机生成的字符。但是,我希望所有STR都完全不同。谁能帮我吗?
-预先感谢-
答案 0 :(得分:1)
如果要使用rand()
获取与运行时相关的输出,则应根据运行时环境使其成为种子。
如注释中所建议,一种简单的方法是在srand(time(NULL))
循环之前调用num
一次:
DEMO。
srand(time(NULL));
for (int i = 0; i < num; ++i)
{
for (int j = 0; j < length; ++j) {
Str += randGen();
}
std::cout << Str << std::endl;
}
尽管rand()
通常应作为Park-Miller LCG实施,
但是,例如C ++标准草案n4687中所述, rand()
中使用的算法是完全由编译器实现定义的:
29.6.9低质量随机数生成[c.math.rand]
int rand(); void srand(unsigned int seed);
... rand 的基础算法未指定。因此, rand 的使用仍然是不可移植的,其质量和性能不可预测且经常令人质疑。
幸运的是,在C ++ 11及更高版本中,我们可以使用<random>
来生成保证的质量随机性。
因此,我建议您按以下方式使用它们。
如果您需要更高质量的随机性,可以使用std::mt19937
代替std::minstd_rand
:
#include <random>
static constexpr char combination[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
constexpr int stringLength = sizeof(combination) - 1;
std::minstd_rand gen(std::random_device{}());
std::uniform_int_distribution<std::size_t> dis(0, stringLength-1);
char randGen() {
return combination[dis(gen)];
}