web-dev-qa-db-fra.com

Remplir un vecteur avec des nombres aléatoires c ++

J'ai un vecteur que j'essaie de remplir avec des nombres aléatoires. Je continue à rencontrer un problème, mais le vecteur génère généralement 0 à chaque fois que je l'exécute (il ne devrait pas générer de 0 jamais). Qu'est-ce que je fais de mal dans mon code écrit ci-dessous pour le rendre en sortie 0 (il en sort 0 plus que tout autre nombre):

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

Je suis débutant et je n’ai pas fait beaucoup de programmation C++ depuis longtemps, donc je ne sais pas ce qui fait que mon code fonctionne mal. Si quelqu'un pouvait expliquer ce que j'ai mal fait, ce serait grandement apprécié.

10
Valrok

Vous appelez le mauvais index dans votre vecteur

Essayez de faire:

cout << myVector[i] << endl;

sinon, vous risquez de courir à la fin de votre sommet pendant les 20 premières itérations environ.

Vous pouvez également appeler .back () sur votre vecteur pour obtenir le dernier élément du vecteur.

6
Serdalis

Vous pouvez utiliser l'algorithme std :: generate pour remplir un vecteur de n éléments avec des nombres aléatoires. 

En C++ moderne, il est recommandé de ne pas utiliser de graine temporelle et std :: Rand, mais d'utiliser random_device pour générer une graine. Pour un moteur basé sur un logiciel, vous devez toujours spécifier le moteur et la distribution. Lire la suite..

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


}

Si vous souhaitez réorganiser les éléments d'une plage dans un ordre aléatoire:

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

J'ajoute juste mes 2 centimes ... Cette réponse est similaire à celle donnée par Marko Tunjic , mais il n’utilise pas std::Rand de C, mais C++ 11 à la place ... .. Il vous permet d’utiliser la distribution de votre choix, uniform_int_distribution dans l'exemple ci-dessous.

#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

Qu'en est-il simplement:

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

Vous appelez le mauvais index dans votre vecteur

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

Ce que vous essayez de faire avec la boucle n’est pas clair, le code crée un vecteur de taille aléatoire, rempli de nombres aléatoires. 

Vous produisez "myVector [b]", mais "b" est la valeur aléatoire, pas l'indice du nombre simplement ajouté. Vous pouvez simplement:

cout << b << endl;

Mais en réalité, vous devriez redimensionner le vecteur et y accéder simplement par index.

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"));
2
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