2017-08-17 154 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; 
}