web-dev-qa-db-ja.com

ベクトルを乱数で埋めるC ++

乱数で埋めようとしているベクトルがあります。しかし、ベクトルを実行するたびにベクトルがほとんど0を出力するという問題が発生し続けます(0を出力すべきではありません)。以下に記述されたコードで何が間違っているのですか?

vector<int> myVector;
srand((unsigned)time(NULL));
int a = Rand() % 20 + 1; //1 to 20    
for (int i =0; i < a; i++){
        int b = Rand() % 20 + 1;
        myVector.Push_back(b);
        cout << myVector[b] << endl;
    }

私は初心者であり、長い間C++プログラミングをあまり行っていないため、何がコードを誤動作させているのかわかりません。誰かが私が間違ったことを説明できたら、それは大歓迎です。

12
Valrok

ベクター内の間違ったインデックスを呼び出しています

やってみてください:

cout << myVector[i] << endl;

そうしないと、最初の20回程度の反復で頂点の端からはみ出す危険があります。

ベクターで 。back() を呼び出して、ベクターの最後のアイテムを取得することもできます。

5
Serdalis

Std :: generateアルゴリズムを使用して、n個の要素のベクトルに乱数を入力できます。

現代のC++では、時間ベースのシードとstd :: Randを使用せず、代わりにrandom_deviceを使用してシードを生成することをお勧めします。ソフトウェアベースのエンジンの場合、エンジンとディストリビューションを常に指定する必要があります。 続きを読む..

#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <functional>

using namespace std;

int main()
{
    // First create an instance of an engine.
    random_device rnd_device;
    // Specify the engine and distribution.
    mt19937 mersenne_engine {rnd_device()};  // Generates random integers
    uniform_int_distribution<int> dist {1, 52};

    auto gen = [&dist, &mersenne_engine](){
                   return dist(mersenne_engine);
               };

    vector<int> vec(10);
    generate(begin(vec), end(vec), gen);

    // Optional
    for (auto i : vec) {
        cout << i << " ";
    }


}

範囲の要素をランダムな順序で並べ替える場合:

  std::shuffle(begin(vec), end(vec), mersenne_engine);
63
Marko Tunjic

単純にどうですか:

std::vector<int> v(1000);
std::generate(v.begin(), v.end(), std::Rand);
10

2セントを追加するだけです...この応答は Marko Tunjic で指定された応答に似ていますが、Cのstd::Randを使用せず、代わりにC++ 11機能を使用します。以下の例では、選択した分布uniform_int_distributionを使用できます。

#include <algorithm>
#include <iostream>
#include <limits>
#include <random>
#include <vector>

static std::vector<int> generate_data(size_t size)
{
    using value_type = int;
    // We use static in order to instantiate the random engine
    // and the distribution once only.
    // It may provoke some thread-safety issues.
    static std::uniform_int_distribution<value_type> distribution(
        std::numeric_limits<value_type>::min(),
        std::numeric_limits<value_type>::max());
    static std::default_random_engine generator;

    std::vector<value_type> data(size);
    std::generate(data.begin(), data.end(), []() { return distribution(generator); });
    return data;
}

int main()
{
    for (auto i = 0u; i < 5; ++i)
    {
        std::vector<int> myVector = generate_data(10);
        myVector = generate_data(10);

        std::cout << "myVector (iteration " << i << "): ";
        for (auto v: myVector)
        {
            std::cout << v << ",";
        }
        std::cout << "\n";
    }
}
6
Marek Kurdej

ベクター内の間違ったインデックスを呼び出しています

cout << myVector[i] << endl;
1
Khalil Ismail

ループで何をしようとしているかは明らかではありません。コードは、乱数で満たされたランダムなサイズのベクトルを作成しています。

「myVector [b]」を出力していますが、「b」はランダムな値であり、追加した数値のインデックスではありません。あなたはちょうどできます:

cout << b << endl;

しかし、実際にはベクトルのサイズを決定し、インデックスでアクセスする必要があります。

int vec_size = Rand() % 20 + 1;
vec<int> myvec(vec_size);
for( int i = 0; i < vec_size; ++i ) {
    vec[i] = Rand() % 20 + 1;
}

/* output the list after you made it */
std::copy(myvec.begin(), myvec.end(),
        std::ostream_iterator<int>(cout, "\n"));
1
Sanjaya R
// here I generate a vector that contains random vectors
// for example, after this code, vec = { {1,4,8}, {1,3,6,7,9}, {2,5,6} }

#include <vector>
#include <time.h>

void generate_random_vectors(const int num_of_Rand_vectors, vector<vector<int>> &vec) {
    for (int j = 0; j < num_of_Rand_vectors; ++j) {
        // the vector size will be randomal: between 0 to 19
        int vec_size = (Rand() % 20);
        vector<int> Rand_vec(vec_size);
        for (int k = 0; k < vec_size; ++k) {
            // each vec element will be randomal: between 1 to 20
            Rand_vec[k] = 1 + (Rand() % 20);
        }
        // each vector will be sorted if you want to
        sort(Rand_vec.begin(), Rand_vec.end());
        // Push each of the 'num_of_Rand_vectors'-th vectors into vec
        vec.Push_back(Rand_vec);
    }
}

void main() {

    srand(static_cast<unsigned int>(time(NULL)));

    // input vector containing random sorted vectors
    vector<vector<int>> vec;
    generate_random_vectors(3, vec);
}
0
Giroud Vren