简体   繁体   English

用随机数填充向量 C++

[英]Fill a vector with random numbers c++

I've got a vector that I'm trying to fill up with random numbers.我有一个我试图用随机数填充的向量。 I keep running into an issue however that the vector mostly outputs 0 each time that I'm running it (it shouldn't output a 0 ever).我一直遇到一个问题,但是每次运行向量时,它主要输出 0(它不应该输出 0)。 What am I doing wrong in my code written below to make it output 0 (it outputs 0 more so than any other number):我在下面编写的代码中做错了什么以使其输出 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;
    }

I am a beginner and have not done much C++ programming in a long time so I'm not sure what is making my code malfunction.我是初学者,很长一段时间没有做过很多 C++ 编程,所以我不确定是什么导致我的代码出现故障。 If someone could explain what I've done wrong it would be greatly appreciated.如果有人能解释我做错了什么,将不胜感激。

You can use std::generate algorithm to fill a vector of n elements with random numbers.您可以使用 std::generate 算法用随机数填充 n 个元素的向量。

In modern C++ it's recommended not to use any time-based seeds and std::rand, but instead to use random_device to generate a seed.在现代 C++ 中,建议不要使用任何基于时间的种子和 std::rand,而是使用 random_device 生成种子。 For software-based engine, you always need to specify the engine and distribution.对于基于软件的引擎,您始终需要指定引擎和发行版。 Read More.. 阅读更多..

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

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

}

If you want to rearrange the elements of a range in a random order:如果要以随机顺序重新排列范围的元素:

  std::shuffle(begin(vec), end(vec), mersenne_engine);

What about simply:简单地说:

#include <vector>
#include <algorithm>
#include <ctime>

std::srand(unsigned(std::time(nullptr)));
std::vector<int> v(1000);
std::generate(v.begin(), v.end(), std::rand);

Just adding my 2 cents... This response is similar to the one given by Marko Tunjic , but it doesn't use std::rand from C, but C++11 features instead.只需添加我的 2 美分...此响应类似于Marko Tunjic给出的响应,但它不使用 C 中的std::rand ,而是使用 C++11 功能。 It allows you to use the distribution of your choice, uniform_int_distribution in the example below.它允许您在下面的示例中使用您选择的分布, 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";
    }
}

You are calling the wrong index in your vector您在向量中调用了错误的索引

Try doing:尝试做:

cout << myVector[i] << endl;

else you will risk running off the end of your vertex for the first 20 or so iterations.否则,在前 20 次左右的迭代中,您将冒着跑掉顶点的风险。

You can also call .back() on your vector to get the last item in the vector.您还可以在向量上调用.back()以获取向量中的最后一项。

您在向量中调用了错误的索引

cout << myVector[i] << endl;

Its not clear what you are trying to do with the loop, the code is creating a vector of random size, filled with random numbers.不清楚你想用循环做什么,代码正在创建一个随机大小的向量,填充随机数。

You are outputting "myVector[b]", but 'b' is the random value, not the index of just added number.您正在输出“myVector[b]”,但“b”是随机值,而不是刚刚添加的数字的索引。 You could just :你可以:

cout << b << endl;

But really you should size the vector, and just access by 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"));
// 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);
}
cout << myVector[b] ?!

它应该是: cout << myVector[i];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM