C++ c++;防止随机数重复

C++ c++;防止随机数重复,c++,C++,我有一个随机数生成器函数(“Rndom(min,max)”, 我有一个int,有4个元素,叫做“Data[3]”。 我使用for循环为“Data”int的元素生成数字(1-4): for(int i=0;i

我有一个随机数生成器函数(“Rndom(min,max)”, 我有一个int,有4个元素,叫做“Data[3]”。 我使用for循环为“Data”int的元素生成数字(1-4):

for(int i=0;i<3;i++)
{
数据[i]=Rndom(1,4)
}
如何防止数据与元素编号重复? 所以,我不想要这个:“数据”元素:1 3 4 1(“1”是重复的)。我想做不同的数字


谢谢你的帮助

使用
map
set
存储生成的数字并避免重复

set<int> s;
for (int i = 0;i < 3;i++)
{
   int x;
   for(;;)
   {
      int x = Rndom(1, 4) ;

      if(s.find(x)==s.end()) 
      {
         s.insert(x);
         Data[i]=x;
         // consider it ..it is not duplicate
         break;
      }
   }
}
set;
对于(int i=0;i<3;i++)
{
int x;
对于(;;)
{
intx=Rndom(1,4);
如果(s.find(x)=s.end())
{
s、 插入(x);
数据[i]=x;
/考虑它…它不是复制品。
打破
}
}
}
你也可以使用或实现同样的事情


map
上使用
set
的原因是
std::set
仅包含键,而在
std::map
中有一个关联的值。

使用
map
set
存储生成的数字并避免重复

set<int> s;
for (int i = 0;i < 3;i++)
{
   int x;
   for(;;)
   {
      int x = Rndom(1, 4) ;

      if(s.find(x)==s.end()) 
      {
         s.insert(x);
         Data[i]=x;
         // consider it ..it is not duplicate
         break;
      }
   }
}
set;
对于(int i=0;i<3;i++)
{
int x;
对于(;;)
{
intx=Rndom(1,4);
如果(s.find(x)=s.end())
{
s、 插入(x);
数据[i]=x;
/考虑它…它不是复制品。
打破
}
}
}
你也可以使用或实现同样的事情


map
上使用
set
的原因是
std::set
只包含键,而在
std::map
中有一个关联的值。

因为您想要一个由无序整数值组成的数组或向量,所以使用
std::shuffle
来无序排列一个用顺序值初始化的向量(或任何东西)

#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <numeric>

int main() {
    std::random_device rd;
    std::mt19937 rng(rd());                       // seed rng using rd
    std::vector<int> data(3);                     // create a 3-entry vector
    std::iota(data.begin(), data.end(), 0);       // fill with sequence
    std::shuffle(data.begin(), data.end(), rng);  // mix entries using rng
    // dump the result
    for(auto r : data) { std::cout << r << ' '; }
    std::cout << '\n';
}
3次执行的输出(相隔1秒以上):

2 3 1 4

4 2 3 1


2 4 3 1

由于您需要一个由无序整数值组成的数组或向量,请使用
std::shuffle
对用顺序值初始化的向量(或任何内容)进行无序排列

#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <numeric>

int main() {
    std::random_device rd;
    std::mt19937 rng(rd());                       // seed rng using rd
    std::vector<int> data(3);                     // create a 3-entry vector
    std::iota(data.begin(), data.end(), 0);       // fill with sequence
    std::shuffle(data.begin(), data.end(), rng);  // mix entries using rng
    // dump the result
    for(auto r : data) { std::cout << r << ' '; }
    std::cout << '\n';
}
3次执行的输出(相隔1秒以上):

2 3 1 4

4 2 3 1



2 4 3 1

您可以将所有数字放在一个向量中,然后进行洗牌。这里的示例显示:您的数组是否总是与数字范围大小相同?非主题:
Data[3]
将不包含4个元素。Data[0]也是一个元素……Data[0]是一个太正确的元素,Data[1]和Data[2]也是如此,但Data[3]不是超出范围的。所以你只有3个元素,你可以把所有的数字放在一个向量中,然后进行洗牌。这里的示例显示:您的数组是否总是与数字范围大小相同?非主题:
Data[3]
将不包含4个元素。Data[0]也是一个元素……Data[0]是一个太正确的元素,Data[1]和Data[2]也是如此,但Data[3]不是超出范围的。所以你只有3个元素。@HolyBlackCat:事实上,我想到了一些不同的东西,这就是为什么我这样回答,不管怎样,我只是想让OP给出一个如何使用…的想法,根据完整的要求进行修改。谢谢,但是我在哪里使用for循环中的“I”int?你刚才用的是“x”int,你用i来做索引,对吗?然后在将
x
插入集合的位置使用@有什么办法可以像我的代码中那样使用int-block吗?@Vettel.Sebastian.:你可以添加那个语句……你想清楚地说明什么pls@HolyBlackCat.:事实上,我想到了一些不同的东西,这就是我这样回答的原因,不管怎样,我只是想让OP给出一个如何使用…的想法,并根据全文进行修改需求。谢谢,但是我在哪里使用for循环中的“I”int?你刚才用的是“x”int,你用i来做索引,对吗?然后在将
x
插入集合的位置使用@维特尔.塞巴斯蒂安在我的代码中有什么办法可以用int block这样做吗?@Vettel.塞巴斯蒂安:你可以加上那句话……你想要的是清楚地说明你没有使用我的函数。。。。。兄弟,这不是windows程序。。。。我正在编写一个游戏,里面没有“包含向量……等等”之类的东西。哈哈,你真有趣。但是我会继续用你想要的答案来逗乐你,用我对
Rndom
实现和静态分配数组的最佳猜测。等等……我正在编写一个游戏,它没有“包含向量……等等”之类的东西。你把你的问题标记为
c++
。std::vector是
c++
中标准库的一部分。哈哈,你没有使用我的函数。。。。。兄弟,这不是windows程序。。。。我正在编写一个游戏,里面没有“包含向量……等等”之类的东西。哈哈,你真有趣。但是我会继续用你想要的答案来逗乐你,用我对
Rndom
实现和静态分配数组的最佳猜测。等等……我正在编写一个游戏,它没有“包含向量……等等”之类的东西。你把你的问题标记为
c++
。std::vector是
c++
中标准库的一部分。