如何每次都以不同的顺序打印出向量
How do I print out vectors in different order every time
我想做两个向量。其中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
。手册页显示了实现算法,这就是你要找的。
另一个简单的算法是:
- init total2 with sequence 0,1,2,…,n其中n为大小total1 - 1
- 选择两个随机数i1和i2,范围为[0,n-1]。
- 交换total2中的元素i1和i2。
- 从(2)重复固定次数的"R"。
该方法允许先验地知道必要的步骤,并控制最终向量的"随机性"水平(R越大越随机)。然而,它的随机性还远远不够好。
另一种方法,在概率分布上更好:
- 填充编号为0,1,2,…的列表
L
total1-1大小。 - 从0到列表
L
- 1的大小之间选择一个随机数i
。 - 将列表
L
的第一个元素i
存储在total2中。 - 从
L
中删除此元素。 - 从(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]]
.
- 如何在C++中递归地按相反顺序打印集合
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 按字母顺序打印存储在字符数组中的信息
- 视觉C++未按所需顺序打印
- C++使用相反的顺序打印带有逗号的列表
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 如何以相反顺序C 打印整数的单个数字
- 我不知道如何创建一个以数字/字母顺序打印出我的整数或字符串的程序
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 以相反的顺序打印链表的后半部分
- 我如何附加双链接以指向正确的节点,以相反的顺序打印
- 按字母顺序打印结构输入C
- 按顺序打印时遇到问题,二叉树的后顺序等
- 按特定顺序打印队列
- 输出未按正确的顺序打印
- 按字典顺序打印给定字符串的所有字母组合的算法
- 使用基于范围的 for 循环以相反的顺序打印矢量
- C++链表-按排序顺序打印
- 我如何使用C ++以相反的顺序打印此单个链表中的元素
- 如何使链接列表按字母顺序打印其内容