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

时间:2013-11-05 04:26:44

标签: c++ random vector integer fill

我想用随机整数填充向量,但不能有重复。

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

srand((unsigned int)time(NULL));
unsigned int min = 0;
unsigned int max = 7;
std::vector<unsigned int> v;

for (int i = 0; i < numberOfSlots; i++) {
  unsigned int rdm = std::rand() % (max - min + 1) + min;
  v.push_back(rdm);
}

这是允许重复整数的代码。这工作正常!

现在我想更改该代码,以便从可能的整数( min max )的相同随机池中生成的随机整数仅在不是已经在向量中。

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

我知道如何改变矢量和东西,但我无法使其正常工作。我想我必须使用while循环并检查向量中所有已存在的整数与新的随机数添加数字,如果它已经在那里生成一个新的随机数并再次检查,等等但我不知道< / p>

我是初学者,这真的很难。有人可以给我一个提示吗?我很感激...非常感谢你

2 个答案:

答案 0 :(得分:3)

您可以使用值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]);
}

答案 1 :(得分:2)

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

从您的非随机整数向量中随机选择一个数字,将该数字添加到随机化的子集向量中,然后将其从非随机整数向量中移除。

现在,您的非随机整数向量是一个较小的,因此在新的较小向量上随机选择一个数字,将其添加到随机化子集向量中,并将其从非随机化向量中移除。重复。

这就是它的样子


Unrandomized

{0, 1, 2, 3, 4, 5, 6, 7}

随机

{}

选择随机索引:5

Yields =&gt;


Unrandomized

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

随机

{5}

选择随机索引:0

Yields =&gt;


Unrandomized

{1, 2, 3, 5, 6, 7}

随机

{5, 0}

选择随机索引:6

产量=&GT;


Unrandommized

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

随机

{5, 0, 7}

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