C ++初学者在这里。我有下面这段代码。它不止于此,但是这是我需要帮助的部分。我需要生成的随机数(0 - 9)和将其推回的载体。我希望这些随机数是唯一的。我怎么做?另外,我无法使用的std ::发现(STD ::开始(矢量)的std ::结束(矢量),A)。谢谢大家这么多。
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
int digit = 0;
int randNo = 0;
cin >> digit;
srand((unsigned)time(NULL));
vector <int> randG(digit);
for(int i = 0; i < randG.size(); i++){
randNo = rand() %10;
randG.at(i) = randNo;
}
}
如果你没有太在意效率,并且想从没有更换均匀采样{A,A + 1,...,B}您可以创建一个vector<int> vstart
其中vstart[i]=a+i
。在此之后,如果你想K个样本,并将它们存储在v_samples
,产生在[0,numrand
随机数v.size()
),推vstart[numrand]
到vsamples
,并删除vstart
采样条目(删除对应于“无需更换”部分),重复该k倍。删除可能是昂贵的如此洗牌vstart
和采摘洗牌向量的前k项。
洗牌的时候要小心,因为你可能无法得到统一的洗牌:https://www.i-programmer.info/programming/theory/2744-how-not-to-shuffle-the-kunth-fisher-yates-algorithm.html。最好的方法是使用随机播放功能在<algorithm>
库:http://www.cplusplus.com/reference/algorithm/shuffle/,还是程序验证的洗牌自己(克努特洗牌是经典的解决了这个问题)。