C ++相同的值通过两个for循环随机生成

时间:2019-01-12 04:22:12

标签: c++ for-loop random random-seed

所以我在这里为循环工作:

    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都完全不同。谁能帮我吗?

-预先感谢-

1 个答案:

答案 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

DEMO

#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)];
}