C++ 使用固定数字池中的随机唯一整数填充向量

C++ 使用固定数字池中的随机唯一整数填充向量,c++,random,vector,integer,fill,C++,Random,Vector,Integer,Fill,我想用随机整数填充一个向量,但里面不能有重复的 首先,我用这段代码将numberOfSlots随机整数放在向量的0到7之间(numberOfSlots可以是2到20): srand((unsigned int)time(NULL)); 无符号整数最小值=0; 无符号整数max=7; std::向量v; 对于(int i=0;i 非随机 {0, 1, 2, 3, 4, 5, 6, 7} {0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at in

我想用随机整数填充一个向量,但里面不能有重复的

首先,我用这段代码将numberOfSlots随机整数放在向量的0到7之间(numberOfSlots可以是2到20):

srand((unsigned int)time(NULL));
无符号整数最小值=0;
无符号整数max=7;
std::向量v;
对于(int i=0;i
这是允许重复整数时的代码。这很好用

现在我想更改代码,这样从同一个可能整数的随机池(从最小到最大)中,生成的随机整数只在不在向量中时添加

因此,如果numberOfSlots是5,那么向量将有5个条目,它们是从池中随机选择的,但不相同,例如7、1、3、5、0。如果numberOfSlots为8,则向量将为例如3、1、2、7、6、0、4、5

我知道如何洗牌的矢量和东西,但我不能让这个工作。我想我必须使用while循环,检查向量中所有已经存在的整数与新的随机数相加,如果它已经在那里,生成一个新的随机数,然后再次检查,等等,但我不知道


我是初学者,这真的很难。谁能给我一个提示吗?我会很感激。。。非常感谢

您可以使用值0..N-1(或您的池值)填充向量,然后将其洗牌。见示例:

// Initialize
for(i = 0; i < N; i++)
  arr[i] = i;

// shuffle
for(i = N - 1; i > 0; i--) {
  j = rand() % i;
  swap(arr[i], arr[j]);
}
//初始化
对于(i=0;i0;i--){
j=rand()%i;
掉期(arr[i],arr[j]);
}

您可以使用值0..N-1(或池值)填充向量,然后将其洗牌。见示例:

// Initialize
for(i = 0; i < N; i++)
  arr[i] = i;

// shuffle
for(i = N - 1; i > 0; i--) {
  j = rand() % i;
  swap(arr[i], arr[j]);
}
//初始化
对于(i=0;i0;i--){
j=rand()%i;
掉期(arr[i],arr[j]);
}

我认为最好的办法是创建一个向量来存储未随机化的整数,然后创建另一个向量来存储随机子集

从未随机化整数向量中随机选择一个数字,将该数字添加到随机子集向量,然后将其从未随机化整数向量中删除

现在,您的未随机化整数向量小了一个,所以请在新的较小向量上随机选择一个数字,将其添加到随机子集向量,然后将其从未随机化向量中移除。重复一遍

下面是它可能的样子


非随机

{0, 1, 2, 3, 4, 5, 6, 7}
{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5
{1, 2, 3, 5, 6, 7}
随机化

{}
{5}
{5, 0}
{5, 0, 7}
选择随机索引:5

收益率=>


非随机

{0, 1, 2, 3, 4, 5, 6, 7}
{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5
{1, 2, 3, 5, 6, 7}
随机化

{}
{5}
{5, 0}
{5, 0, 7}
选择随机索引:0

收益率=>


非随机

{0, 1, 2, 3, 4, 5, 6, 7}
{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5
{1, 2, 3, 5, 6, 7}
随机化

{}
{5}
{5, 0}
{5, 0, 7}
选择随机索引:6

收益率=>


无规则

{1, 2, 3, 5, 6} // 7 removed at index #6
随机化

{}
{5}
{5, 0}
{5, 0, 7}


假设你只需要在这里选择3个随机值,这样你就得到了5,0,7。此方法确保没有重复项。我认为使用内联函数有一种更简单的方法,但我不知道,上面的内容应该就足够了

我认为最好的办法是创建一个向量来存储未随机化的整数,然后创建另一个向量来存储随机子集

从未随机化整数向量中随机选择一个数字,将该数字添加到随机子集向量,然后将其从未随机化整数向量中删除

现在,您的未随机化整数向量小了一个,所以请在新的较小向量上随机选择一个数字,将其添加到随机子集向量,然后将其从未随机化向量中移除。重复一遍

下面是它可能的样子


非随机

{0, 1, 2, 3, 4, 5, 6, 7}
{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5
{1, 2, 3, 5, 6, 7}
随机化

{}
{5}
{5, 0}
{5, 0, 7}
选择随机索引:5

收益率=>


非随机

{0, 1, 2, 3, 4, 5, 6, 7}
{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5
{1, 2, 3, 5, 6, 7}
随机化

{}
{5}
{5, 0}
{5, 0, 7}
选择随机索引:0

收益率=>


非随机

{0, 1, 2, 3, 4, 5, 6, 7}
{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5
{1, 2, 3, 5, 6, 7}
随机化

{}
{5}
{5, 0}
{5, 0, 7}
选择随机索引:6

收益率=>


无规则

{1, 2, 3, 5, 6} // 7 removed at index #6
随机化

{}
{5}
{5, 0}
{5, 0, 7}


假设你只需要在这里选择3个随机值,这样你就得到了5,0,7。此方法确保没有重复项。我认为使用内联函数有一种更简单的方法,但我不知道,上面的内容应该就足够了

如果你真的知道如何随机洗牌一个向量,这应该是微不足道的。正确的洗牌()不涉及检查元素是否已经存在。对不起,我是指像std::random_shuffle(v.begin(),v.end())这样洗牌,但它对我的问题没有真正的帮助。。。我应该在我的帖子中忽略这一点,如果你真的知道如何随机洗牌一个向量,这应该是微不足道的。正确的洗牌()不涉及检查元素是否已经存在。对不起,我是指像std::random_shuffle(v.begin(),v.end())这样洗牌,但它对我的问题没有真正的帮助。。。我应该在我的帖子中忽略这一点^^可能的重复,但是如果数字池是8个数字(0到7),向量大小应该只有5个。那么向量中只会有0到4的数字,对吗?或者我弄错了如果是这样,你可以创建向量大小7,将其洗牌,然后复制前5个值,索引为[0-5]。或者,如果你愿意,你可以把你的向量调整到5。啊,我没想到,听起来不错。我现在就试试,谢谢!这是完美的工作,一个非常好的主意!谢谢您甚至可以通过调用
std::shuffle
std::random\u shuffle
来简化洗牌过程。但是如果数字池是8个数字(0到7),向量大小应该只有5个。那么向量中只会有0到4的数字,对吗?或者我弄错了如果是这样,你可以创建向量大小7,将其洗牌,然后复制前5个值,索引为[0-5]。或者,如果你愿意,你可以把你的向量调整到5。啊,我没想到,听起来不错。我现在就试试,谢谢!这是完美的工作,一个非常好的主意!谢谢您甚至可以通过