我想用随机整数填充向量,但不能有重复。
首先,我有这个代码将 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>
我是初学者,这真的很难。有人可以给我一个提示吗?我很感激...非常感谢你
答案 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。这种方法确保没有重复。我认为使用内联函数有一种更简单的方法,但我不知道它,上面应该就足够了。