如何从向量中随机删除一个元素?

Posted

技术标签:

【中文标题】如何从向量中随机删除一个元素?【英文标题】:How to erase an element randomly from a vector? 【发布时间】:2020-04-06 13:38:15 【问题描述】:

我想知道如何随机擦除向量中的元素。例如,我有一个向量,其中包含整数 1,2,3,4,5。我想随机删除其中一个。我该怎么做?

int main() 

    vector <int> myvec 1,2,3,4,5; 



 if (!myvec.empty())  

     myvec.erase(myvec.begin());


     cout << myvec.at(0);
     cout << myvec.at(1);
     cout << myvec.at(2);
     cout << myvec.at(3);


 

 else 

     cout << "Vector is empty" << endl;

     


以上是我到目前为止的代码。它是一个 if 和 else 语句,用于检查向量是否为空并擦除一个元素。问题是我不确定如何让它删除随机元素。目前它只删除第一个元素。

【问题讨论】:

如果您在此处搜索“[c++] 生成随机数”,您将找到有关如何在某个范围内生成随机值的说明(例如,从 0myvec.size()-1)。生成这样一个值,并将其添加到myvec.begin() 以获得引用myvec 元素的迭代器。 @maany:在学习编程时,有助于将问题分解成更小的部分。你可以删除第二个元素吗?你能写一个函数来接受int i 并删除第 i 个元素吗?之后,您只需要使用随机值调用该函数。 @MSalters 是的,我可以通过在开始后添加 +1 来删除第二个元素 【参考方案1】:

使用随机整数生成器生成一个从(0 到向量大小 -1)的整数,然后对生成的数字使用擦除,如下所示

#include<random>
#include<chrono>
#include<vector>
int main()

    std::vector <int> myVec 1,2,3,4,5;

    //creat a random engine object and seed it 
    std::default_random_engine engineObj(std::chrono::system_clock::now().time_since_epoch().count());
    //The distribution will be used
    std::uniform_int_distribution<size_t> randomInt0ul, myVec.size()-1;

    //Erase
    myVec.erase(myVec.begin() + randomInt(engineObj));

    //Test
    for(auto const & el: myVec) std::cout << el << " ";
    

【讨论】:

【参考方案2】:

感谢 cmets。我想通了。

srand((unsigned) time(0));
  int randomNumber;
  for (int index = 0; index < 1; index++) 
    randomNumber = (rand() % 5) + 0;
    cout << randomNumber << endl;
  



    vector <int> myvec 1,2,3,4,5; 



 if (!myvec.empty())  


     myvec.erase(myvec.begin() + randomNumber);


     cout << myvec.at(0);
     cout << myvec.at(1);
     cout << myvec.at(2);
     cout << myvec.at(3);


 

 else 

     cout << "Vector is empty" << endl;

     


【讨论】:

+ 0 什么都不做,您对rand() 的使用已经过时,但可能适合您的目的【参考方案3】:

你想要rand() function。使用它为您的向量生成一个随机索引。

【讨论】:

自 2011 年起不再推荐。改用#include &lt;random&gt;(除非你被一些非常旧的编译器困住):https://***.com/questions/19665818/generate-random-numbers-using-c11-random-library

以上是关于如何从向量中随机删除一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

从向量中删除元素时如何减小向量的大小?

如何从具有用户类参数的向量中删除元素?

如何从数组中删除随机元素。 Python

随机向量 a 具有来自 R 中均匀分布的元素

Randomizer 从向量中选择一个数字并将其删除

如果已删除,如何从向量中删除对象