【问题标题】:Fill a vector with random numbers c++用随机数填充向量c ++
【发布时间】:2014-02-02 21:38:18
【问题描述】:

我有一个向量,我试图用随机数填充它。我一直遇到一个问题,但是每次我运行它时,向量大多输出 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++ 编程,所以我不确定是什么导致我的代码出现故障。如果有人能解释我做错了什么,将不胜感激。

【问题讨论】:

  • myVector[b] 应该是 myVector[i]
  • 或者,可以说应该是myVector.back()

标签: c++ random vector srand


【解决方案1】:

您可以使用 std::generate 算法用随机数填充 n 个元素的向量。

在现代 C++ 中,建议不要使用任何基于时间的种子和 std::rand,而是使用 random_device 来生成种子。对于基于软件的引擎,您总是需要指定引擎和分布。 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 << " ";
    }
    

}

如果你想以随机顺序重新排列范围的元素:

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

【讨论】:

  • 您应该使用std::ref 绑定对mersenne_engine 的引用,否则使用相同的生成器生成多个向量将导致所有向量相同。 See the associated question.
  • 另一个警告说明,random_device 可能根本不是很随机!例如,Windows 下的 GCC 总是为您发布的代码生成相同的输出。
【解决方案2】:

简单地说:

#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);

【讨论】:

  • 看起来它会用相同的值填充它
  • @x4444:在我的机器上,它经过几次测试后工作正常。也许放一个“std::srand(unsigned(std::time(nullptr)));”在前面。
【解决方案3】:

只需加上我的 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";
    }
}

【讨论】:

  • 您说 Marko Tunjic 的答案在 C 中使用 std::rand?能否请您为我详细解释一下?
  • 当我写我的答案时,它曾经使用rand。看看第一版stackoverflow.com/revisions/23143753/1
【解决方案4】:

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

尝试做:

cout << myVector[i] << endl;

否则,在前 20 次左右的迭代中,您将冒着跑出顶点末端的风险。

您也可以在向量上调用.back() 以获取向量中的最后一项。

【讨论】:

  • 啊,我想这会是我没看到的小东西。就速度而言,使用 .back() 或 [i] 会有什么区别吗?
  • 您必须对其进行基准测试,但我强烈怀疑 .back() 更快、更安全。
  • @Valrok 顺便说一句,如果您将来有 C++11 实现可供您使用,我强烈建议您使用 &lt;random&gt; 库。它确实解决了很多问题,例如模偏差。 See it live
  • @Valrok:如果您启用优化,它们可能会同样快。优化器应该能够生成功能相同的代码。
【解决方案5】:

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

cout << myVector[i] << endl;

【讨论】:

    【解决方案6】:

    不清楚您要对循环做什么,代码正在创建一个随机大小的向量,其中填充了随机数。

    您正在输出“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"));
    

    【讨论】:

    • 它上面的变量(a)故意是1到20之间的随机数,我试图使向量的大小为a,每个索引都有一个随机数
    【解决方案7】:
    cout << myVector[b] ?!
    

    应该是:cout &lt;&lt; myVector[i];

    【讨论】:

      【解决方案8】:
      // 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);
      }
      

      【讨论】:

      • 与原帖几乎没有关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2018-02-14
      相关资源
      最近更新 更多