0

我想用随机整数填充一个向量,但其中不能有重复项。

首先,我有这段代码将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);
}

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

现在我想更改该代码,以便从相同的可能整数随机池(minmax)生成的随机整数仅在它不在向量中时才被添加。

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

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

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

4

2 回答 2

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]);
}
于 2013-11-05T04:32:16.607 回答
2

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

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

现在你的非随机整数向量小了一个,所以在新的更小的向量上随机选择一个数字,将它添加到随机子集向量中,然后从非随机向量中删除它。重复。

这是它可能的样子


非随机

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

随机的

{}

选择随机指数:5

产量 =>


非随机

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

随机的

{5}

选择随机索引:0

产量 =>


非随机

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

随机的

{5, 0}

选择随机索引:6

产量=>


非随机的

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

随机的

{5, 0, 7}

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

于 2013-11-05T04:52:09.267 回答