2017-08-17 63 views
3

我正在尝试为我的程序自动化测试用例,并且我想生成随机数字串来测试...第一个测试将使用基数为2的数字,所以我想生成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)'是做什么的。然后考虑将其转换为整数时会发生什么。 –

+3

你应该看看[随机](http://en.cppreference.com/w/cpp/numeric/random)标准库(从C++ 11开始可用) - 它比'rand()'更通用。 。 – Holt

回答

1

对于0/1问题:

num = rand()%2;

将生成一个更简单的0或1的数字。 用你当前的表达式,rand()/ RAND_MAX始终为< 1,除非rand()== RAND_MAX,在这种情况下它等于1。加入1给出几乎始终为1,或2,如果兰特()== RND_MAX

对于恒定结果

即使兰特()返回一个伪随机序列时,它总是会生成在程序的同一序列默认启动。如果您在同一个程序中第二次调用结果,那么结果会不同,因为您在随机数序列中进行了前进。如果你想运行TU返回不同的结果每个理线的第一调用RAND(),你必须调用RAND()

+0

所有优秀的答案,感谢所有。这个答案很好解释,谢谢 – Swallows

3

首先,你应该初始化发电机,e.g:

srand(time(NULL)); 

有了这个,你将确保你不会每次都得到相同的号码。

而且为了生成数字从范围,你应该尝试:

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

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

3

或者,你可以使用<random>来生成字符串,如果你有C++ 11或更高。

#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; 
} 
1

如果通过RAND_MAX划分函数srand()函数,你会得到一个号码在0..1,并通过强制转换为整数,你在很多情况下,0获得(由于截断)。最后0 + 1是1

也许你需要的东西是这样的:
兰特()%(基地),即rand() % (2)

不要忘了初始化随机数生成器:
srand(time(NULL));

1

您可以使用std::bernoulli_distribution生成布尔值和std::uniform_int_distribution之前调用

srand(time(NULL)); 

生成整数值。

#include <random> 
#include <string> 

template <typename Generator> 
std::string random_binary_string(Generator& g, std::size_t n) { 
    std::bernoulli_distribution d; 

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

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

    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; 
}