生成随机长度的随机数字字符串

3

我正在尝试自动化我的程序测试用例,并希望生成随机数字串进行测试... 第一个测试将使用二进制数字,因此我想生成0和1的随机长度n的数字串,其中n从1到100。目前我已经有了下面这段代码,但它总是返回相同的字符串(相同的长度),并且只生成整个字符串中的1或0。

int digNum = rand() % 100 + 1;
int num;

for(int i = 0; i < digNum; i++) {
    num = ((double) rand() / (RAND_MAX)) + 1;
    s1 = s1 + to_string(num);
}
cout << s1 << endl;

你的想法是什么?

1
你是否已经初始化了srand,例如调用了srand(time(NULL)) - muXXmit2X
1
想一想 (double) rand() / (RAND_MAX) 是做什么的。然后再思考将其转换为整数时会发生什么。 - Some programmer dude
3
你应该查看 random 标准库(自 C++11 以来可用)- 它比 rand() 更加通用。 - Holt
5个回答

4

如果您使用C++11或更高版本,则可以使用<random>来生成字符串。

#include <iostream>
#include <chrono>
#include <random>
#include <algorithm>

int genRandom(std::mt19937 & mt, int ls, int rs)
{
    std::uniform_int_distribution<int> distribution(ls, rs);
    return distribution(mt);
}

int main()
{
    std::mt19937 mt_rand;
    auto seed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    mt_rand.seed(static_cast<unsigned>(seed));

    std::string randomString(genRandom(mt_rand, 0, 100), ' ');
    std::generate(std::begin(randomString), std::end(randomString), [&] () { return '0' + (genRandom(mt_rand, 0, 1)); });
    std::cout << randomString << std::endl;
    return 0;
}

3

首先,您应该初始化生成器,例如:

srand(time(NULL));

使用这种方法,你可以确保每次得到不同的数字。

如果要生成一定范围内的数字,可以尝试以下方法:

rand() % (max + 1 - min) + min

1
每次调用 rand()/RAND_MAX,它都会给你一个介于0和1之间的数字。所以你只需要决定这个数字是否大于0.5,如果大于则为1,如果小于则为0。 - macroland

1
如果你将srand()函数除以RAND_MAX,你会得到一个在0到1之间的数字,通过转换为整数可以得到很多情况下的0(由于截断)。最后0 + 1等于1。也许你需要这样做:
rand() % (base),即rand() % (2)。别忘了初始化随机数生成器:
srand(time(NULL));

1

针对0/1问题:

num = rand()%2;

将生成一个简单的数字,即0或1。使用当前的表达式,rand()/RAND_MAX始终小于1,除非rand()==RAND_MAX,在这种情况下它等于1。加1几乎总是1,如果rand()==RND_MAX,则为2。

针对常量结果

即使rand()返回伪随机序列,默认情况下在程序启动时它总是生成相同的序列。如果在同一程序中第二次调用它,结果将不同,因为您已经推进了随机数序列。如果要使每个进程运行的第一个rand()调用返回不同的结果,则必须调用

srand(time(NULL));

在调用 rand() 之前


所有的答案都很好,我非常感激。这个答案解释得很清楚,谢谢。 - Swallows

1
你可以使用std::uniform_int_distribution生成整数值。
#include <random>
#include <string>

template <typename Generator>
std::string random_binary_string(Generator& g, std::size_t n) {
    std::uniform_int_distribution<char> d('0', '1');

    std::string s;
    s.reserve(n);

    for (std::size_t i = 0; i < n; ++i) {
        s += d(g);
    }

    return s;
}

template <typename Generator>
std::size_t random_size(Generator& g, std::size_t a, std::size_t b) {
    std::uniform_int_distribution<std::size_t> d(a, b);
    return d(g);
}

一个 std::random_device 通常会生成不确定的随机数。

#include <iostream>

int main() {
    std::random_device g;
    std::cout << random_binary_string(g, random_size(g, 1, 100)) << std::endl;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接