2016-05-18 9 views
2

私はちょうどC++を学んでいます。範囲内のユニークな要素の集合を生成する

0から9までの4つの異なるintのベクトルを作成しようとしています。私はプログラムが実行されるたびに異なる乱数を得るために、シードとrandint()関数を使用しています。私が持っている問題は、乱数を受け取った後で、その値がすでにベクトルに保持されていないことを確認する方法です。私のコードの例。

int seed() 
{ 
    // Produce computers numbers 
    int seed; 
    int x; 
    cout << "Please enter any Integer!\n"; 
    cin >> x; 
    seed = randint(x) % 10; 
    return seed; 
} 

int main() 
{ 
    while(keys.size() !=4) 
    { 
     key = seed(); 
    } 
} 

あなたはint型のキーを見ることができるようになりました乱数を保持しているが、私は、キーが現在のベクトルで開催された他の番号から一意であることを確認するまで(キー)keys.push_back使用したくありません。

+9

0-9のベクトルを作り、それをシャッフルしてから最初の4つの要素をつかみましょう。 – NathanOliver

+0

おそらく['std :: find'](http://en.cppreference.com/w/cpp/algorithm/find)が必要です。 [algortihms](http://en.cppreference.com/w/cpp/header/algorithm)が利用可能で、['ベクトル'](http://en.cppreference.com/w/cpp/container /ベクトル)を提供しなければなりません。 – nwp

+0

正直なところ、私はベクトルをシャッフルする方法を学んでいないので。これは私が読んでいる本の練習であり、あなたはrandint()を使いたいと思っています。また、プログラムの他の部分では、ユーザーが自分の4つの数字を推測しようとするために自分の4つの数字を入力するようになっているので、私はどのように知る必要があります。その上に、彼らは正しい順序で数を推測しなければならない。だから私はプログラムの中でこれを再びテストできるようにする必要があるだろう。今、私は困った。 –

答えて

1

あなたが探していることはあなたが要素{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} の配列を作成Fisher-Yets

のシャッフルアルゴリズムです。次に、あなたの配列Rangeの最初の4つの要素を取得し、その後

std::vector<int> GenerateRandomUniqueNumbers(int len) 
{ 
    if(len > 10) // Early exit 
     return std::vector<int>(); 

    std::vector<int> range(10); 
    std::iota(range.begin(), range.end(), 0); 
    // or just 
    // std::vector<int> range = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 

    for(int i = 0; i < len; ++i) 
    { 
     int j = random() % range.size(); 
     std::swap(range[i], range[j]); 
    } 
    range.resize(len); 
    return range; 
} 

範囲

でランダムなインデックスとそれを交換し、各要素を歩きます。

ループの回数を4回に制限できます。

+0

または単にstd :: shuffleを使用してください –

+0

私はベクトルの終わりに達するよりも早く停止することができるようにループに制限を追加しました。 – teivaz

+0

ありがとう、これは非常に便利です! –

8

数字を保存するのにstd::unordered_setを使用することはどうですか?サイズが4未満(ループなど)であれば、追加してください。

ベクターに必要な場合は、セット内の数字を生成した後にベクターを作成できます。

+0

私はあなた達がどちらも正しいと確信しています。std ::まだ教えられていないので、それについていくつかの研究をしなければなりません。私はこれまでにカバーされたものを私が使いたいと思っていたと確信していますが、それは私に悪くない研究ができる別の方法を与えてくれます。みんなありがとう! –

+1

@ B.Sabres15もしあなたがベクトルを使っていれば、それは['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)です。 [標準コンテナ](http://en.cppreference.com/w/cpp/container)のほとんどは、同様のインターフェース(メンバー関数が設定されている場合)を持っています。 –

0

lower_boundを使用すると、正しい挿入ポイントを見つけてベクターを整理しておくことができます。次に、binary_searchを使用して、挿入を実行する前にベクトル内に要素があるかどうかを知ることができます。

関連する問題