0

我正在尝试构建一个随机长度数组(size1)。我研究这样做的方法是有两个单独的数组,一个用于我的随机数和一个辅助“检查”数组,以确保数字不会重复。这些在我的代码中分别被标记为 (shuffle) 和 (visit)。count1 是一个整数,用于通过我的 for 循环进行计数。

我已将以下内容包含在不同的组合中,但没有奏效。

    #include <ctime>
    #include <time.h>
    #include <cstdlib>

我似乎正在努力的代码是这样的:

    srand((unsigned)time(0));

for (count1 = 0; count1 < size1; count1++)
{
    num = (rand()%size1);
        if (visit[num] == 0)
        {
            visit[num] = 1;
            shuffle[count1] = num;
        }
}
4

3 回答 3

3

您对 srand 的使用没有任何问题。但是,您描述的任务非常简单,不涉及rand函数的使用。

std::vector<int> v(size);
std::iota(v.begin(), v.end(), 0);
std::random_shuffle(v.begin(), v.end());

如果你没有这个iota函数,它只会生成一个递增的整数序列。

于 2011-11-28T19:37:25.993 回答
2

用数字 0 到 size1-1 填充你的数组然后打乱这些数字会更容易。

所以在类似c的代码中(很久没用c了):

for (int count = 0; count < size1; count++) {
    shuffle[count] = count;
}

然后洗牌

for (int index = 0; index < size1; index++) {
    int shuffleIndex = index + rand() % (size1 - index);
    int temp = shuffle[shuffleIndex];
    shuffle[shuffleIndex] = shuffle[index];
    shuffle[index] = temp;
}

基本上,对于数组中的第一个元素,选择任何索引并切换值。现在第一个索引是随机选择的。对于第二个元素,选择一个随机索引(不包括已随机选择的第一个索引)并执行相同操作。重复直到到达最后一个元素。

于 2011-11-28T19:41:40.450 回答
1

#include的 s 不是问题。问题是:当您生成的第一个号码已经被使用时,您并没有尝试生成备用号码。

您应该while在 for 循环中包含一个循环,它会不断生成新数字,直到找到一个有效的数字。

他们现在是这样写的,如果你4,1,4,2,4size1= 5 生成序列,你的数组最终看起来像这样:

{4,1,0,2,0}

假设每个条目都设置为0最初。这是因为您将跳过为其4生成两个额外 s 的索引。

于 2011-11-28T19:35:25.043 回答