Заполнить вектор случайными числами с++
У меня есть вектор, который я пытаюсь заполнить случайными числами. Однако я продолжаю сталкиваться с проблемой, что вектор в основном выводит 0 каждый раз, когда я его запускаю (он не должен выводить 0 когда-либо). Что я делаю неправильно в моем коде, написанном ниже, чтобы вывести 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++, поэтому я не уверен, что делает мой код неисправным. Если кто-то может объяснить то, что я сделал неправильно, было бы очень признательно.
8 ответов
вы вызываете неправильный индекс в своем векторе
попробуйте:
cout << myVector[i] << endl;
иначе вы рискуете убегал конец вершинного за первые 20 итераций.
вы также можете позвонить .back () на вашем векторе, чтобы получить последний элемент в векторе.
вы можете использовать алгоритм 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);
просто добавляю свои 2 цента... Этот ответ аналогичен тому, который дает Марко Tunjic, но он не использует std::rand
из C, но вместо этого функции 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";
}
}
неясно, что вы пытаетесь сделать с циклом, код создает вектор случайного размера, заполненный случайными числами.
вы выводите " 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"));
// 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);
}