C++ 使用两个数字范围创建随机生成并删除重复项。(C+;+;)

C++ 使用两个数字范围创建随机生成并删除重复项。(C+;+;),c++,C++,我正在尝试使用两个数字范围创建一个随机生成的数字。例如: value = rand() % 13 + 1; suit = rand() % 4 + 1; cout<<cardd<<color<<endl; value=rand()%13+1; suit=rand()%4+1; cout您可以将值存储在std::set中,或者只需从向量中删除重复项: std::sort(vec.begin(), vec.end()); vec.erase(std::uniqu

我正在尝试使用两个数字范围创建一个随机生成的数字。例如:

value = rand() % 13 + 1;
suit = rand() % 4 + 1;
cout<<cardd<<color<<endl;
value=rand()%13+1;
suit=rand()%4+1;

cout您可以将值存储在
std::set
中,或者只需从向量中删除重复项:

std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

我不明白你的实际问题。但是我可以做一些事情来消除随机数中的重复项

首先,接下来的两行是有问题的:

value = rand() % 13 + 1;
suit = rand() % 4 + 1;
因为
rand()%M
无法在
[0,M-1]
中生成完整范围的随机数。真正的原因是,
rand()
is在
[0,INT\u MAX]
中生成一个随机数,但是
INT\u MAX
有时不能精确地除以
M

如果您不想像上面那样使用
。你可以稍微修改一下

  value =((double)rand())/INT_MAX * 13 ;
  suit = ((double)rand())/INT_MAX*4;
最后,我建议
std::default\u random\u engine
uniform\u int\u distribution
,如下所示:

static std::default_random_engine e(time(0));
uniform_int_distribution u(1,13);

unordered_set<int> numbers;
int number;
do
{
   number=u(e);
}while(numbers.find(number)!=numbers.end());
numbers.insert(number);
static std::default_random_引擎e(时间(0));
均匀分布u(1,13);
无序的集合数;
整数;
做
{
数字=u(e);
}while(numbers.find(number)!=numbers.end());
编号。插入(编号);

我的意思是,您可以使用
无序集
来记录生成的数字,并避免重复。

我建议使用一对,然后您可以将每个新对与一对向量进行比较:

首先创建向量:

vector<pair<int,int>> deck;
以下是一个可能适合您需要的工作原型:

#include <iostream>
#include <vector>
#include <limits.h>
#include <algorithm>

int main()
{
    srand(time(0));
    std::vector <std::pair<int,int>> deck;
    for(int n = 0;n < 52;n++){
        std::pair <int,int> card;
        card.first = ((double)rand())/INT_MAX * 13;
        card.second = ((double)rand())/INT_MAX*4;
        if(!binary_search(deck.begin(), deck.end(), card)){
            deck.push_back(card);
            std::sort(deck.begin(), deck.end());
            std::cout << "\n" << card.first << " " << card.second;
        }else{
            std::cout << "\ndiscarding duplicate: " << card.first << " " << card.second;
            n--;
        }
    }
}
#包括
#包括
#包括
#包括
int main()
{
srand(时间(0));
向量组;
对于(int n=0;n<52;n++){
std::双卡;
card.first=((双)兰德())/INT_MAX*13;
card.second=((双)兰德())/INT_MAX*4;
如果(!二进制搜索(deck.begin(),deck.end(),card)){
牌组。推回(牌);
std::sort(deck.begin(),deck.end());

std::你能澄清一下你所说的“重复”是什么意思吗?可能的重复:或者用这些数字,你可以用所有可能的组合填充一个向量,并根据需要删除它们。与其尝试删除重复,为什么你不只是一堆卡片,然后选择前几个?
if(!binary_search(deck.begin(), deck.end(), card)){
  deck.push_back(card);
}
#include <iostream>
#include <vector>
#include <limits.h>
#include <algorithm>

int main()
{
    srand(time(0));
    std::vector <std::pair<int,int>> deck;
    for(int n = 0;n < 52;n++){
        std::pair <int,int> card;
        card.first = ((double)rand())/INT_MAX * 13;
        card.second = ((double)rand())/INT_MAX*4;
        if(!binary_search(deck.begin(), deck.end(), card)){
            deck.push_back(card);
            std::sort(deck.begin(), deck.end());
            std::cout << "\n" << card.first << " " << card.second;
        }else{
            std::cout << "\ndiscarding duplicate: " << card.first << " " << card.second;
            n--;
        }
    }
}