如何每次都以不同的顺序打印出向量

How do I print out vectors in different order every time

本文关键字:顺序 打印 向量 何每次      更新时间:2023-10-16

我想做两个向量。其中vector1 (total1)包含一些字符串,vector2(total2)包含一些随机的唯一数字(在0和total1之间)。size() - 1)

我想编写一个程序,它可以打印出总共15个字符串,但是每次打印的顺序不同。我不想使用迭代器之类的东西,因为我想提高我解决问题的能力。

这是导致程序崩溃的特定函数。

    for (unsigned i = 0; i < total1.size();)
{
    v1 = rand() % total1.size();
    for (unsigned s = 0; s < total1.size(); ++s)
    {
        if (v1 == total2[s])
            ;
        else
        {
            total2.push_back(v1);
            ++i;
        }
    }
}

我非常感激我能得到的任何帮助!

我可以建议您更改算法吗?因为,即使你当前的一个是正确实现的("s",在你的代码中,必须从0到total2。Size不是total1。大小,如果找到元素,中断并生成一个新的随机),它有以下缺点:假设向量为1,000.000个元素,你正在尝试最后一个随机数。你有1/1000000的概率找到一个以前没有使用过的随机数。这是一个非常小的数目。最后一个数字的概率是1万分之2,也很小。总之,你的程序将循环并消耗大量的CPU资源。

你最好的选择是遵循@NathanOliver的建议,寻找函数std::shuffle。手册页显示了实现算法,这就是你要找的。

另一个简单的算法是:

  1. init total2 with sequence 0,1,2,…,n其中n为大小total1 - 1
  2. 选择两个随机数i1和i2,范围为[0,n-1]。
  3. 交换total2中的元素i1和i2。
  4. 从(2)重复固定次数的"R"。

该方法允许先验地知道必要的步骤,并控制最终向量的"随机性"水平(R越大越随机)。然而,它的随机性还远远不够好。

另一种方法,在概率分布上更好:

  1. 填充编号为0,1,2,…的列表Ltotal1-1大小。
  2. 从0到列表L - 1的大小之间选择一个随机数i
  3. 将列表L的第一个元素i存储在total2中。
  4. L中删除此元素。
  5. 从(2)开始重复,直到L为空。

如果您只是想洗牌vector<string> total1,您可以不使用帮助vector<int> total2来做到这一点。这是一个基于Fisher-Yates shuffle的实现。

for(int i=n-1; i>=1; i--) {
    int j=rand()%(i+1);
    swap(total1[j], total1[i]);  // your prof might not allow use of swap:)
}

如果必须使用vector<int> total2,则使用上述算法进行洗牌。接下来,您可以使用它从total1创建一个新的vector<string> result,其中result[i]=total1[total2[i]] .