2017-08-17 25 views
3

私のプログラムのテストケースを自動化しようとしています。テストする数字のランダムな文字列を生成したかったのです...最初のテストはベース2の数字で始まります。ここでnは1から100までの任意の長さnの0と1を生成します。これは私が今までに持っているもので、同じ文字列(同じ長さ)を返し続け、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

のrand()%(ベース)の乱数ジェネレータを初期化することを忘れないでください rand() % (2)

、すなわち

0/1問題の場合:

num = rand()%2;

さらに簡単に0または1の番号を生成します。 rand()/= RAND_MAXが1に等しい場合を除いて、現在の式では、rand()/ RAND_MAXは常に<です。 1添加して、ほとんど常に1、又は2与える定数結果についてのrand()== RND_MAX

場合

ランド()は、擬似ランダムシーケンスを返す場合でも、常にプログラムで同じシーケンスを生成しますデフォルトで開始します。乱数シーケンスを進めたときと同じプログラムで2回目に呼び出すと、結果は異なります。あなたはTUが異なる結果を返す実行し、各プロセスへの最初の呼び出しをランドに()したい場合は、あなたがブール値とstd::uniform_int_distributionへを生成するstd::bernoulli_distributionを使用することができます

+0

すべての素晴らしい答えは、すべての人に感謝しています。この答えはよく説明された、ありがとう – Swallows

3

は、まず、例えば、発電機を初期化する必要があります。これにより

srand(time(NULL)); 

をあなたは毎回同じ番号を取得することはできませんことを確認します。

そして、あなたは試してみてください範囲から数値を生成するために:あなたはC++ 11以上を持っている場合

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

'rand()/ RAND_MAX'を呼び出すたびに、0と1の間の数値が返されます。この数値が0.5より大きいかどうかを判断するだけです。小さければ1、小さければ0です。 – macroland

3

、あなたの文字列を生成する<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; 
} 
1

あなたはRAND_MAXでsrand関数()関数を分割した場合、あなたは0..1で番号を取得し、整数にキャストして、あなたはケース(による切り捨て)0の多くに入ります。そして最後に0 + 1たぶん、あなたはこのような何か1

を必要としている。
srand(time(NULL));

1

ランド()を呼び出す前に

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; 
} 
関連する問題