生成唯一随机数在C ++

问题描述 投票:1回答:1

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;
            }
  }
c++ random
1个回答
0
投票

如果你没有太在意效率,并且想从没有更换均匀采样{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/,还是程序验证的洗牌自己(克努特洗牌是经典的解决了这个问题)。

© www.soinside.com 2019 - 2024. All rights reserved.