好吧,所以我想制作一个有助于我学习的程序。我的想法是基于闪存卡和随机数生成器。由于我在C++中还有很多东西要学,我想知道有什么好的方法或例子可以实现我的目标。
我希望程序从预定义的列表中向用户输出一个随机字符串,并在重新开始之前遍历所有定义的字符串。
简单地说。。。为了让"生成器"以随机顺序遍历预定义的字符串,我需要做什么?
这样的程序由三部分组成:
- 获取问题
这些问题必须放在一个类似的文件中
What is the capital of Arkansas? Little Rock
将它们全部放在一个文本文件中,每行一个。将它们读入字符串数组中,如下面的答案所示。
- 打印出数组中的随机问题并接受输入
不要忘记根据?
的位置将其分为问题和答案。这意味着你只需要一个?每个问题。如果答案符合?之后的答案?,增加正确的计数器。无论哪种方式,增加您的总计数器。
- 比较结果
最后,给用户一个报告,告诉他们有多少是对的或错的。
每一个都是简单的问题,你可以一次解决一个,直到你有了完整的解决方案。:-)
完成后,查看
如果要按随机顺序遍历所有字符串,一种方法是生成一组从0
到N-1
的索引作为std::vector<size_t> idx
,使用std::shuffle
对向量idx
进行混洗,然后使用混洗后的向量循环遍历字符串向量。
这里有一个简单的例子来说明它是如何工作的:
#include <iostream>
#include <random>
#include <algorithm>
#include <numeric>
#include <utility>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::vector<std::pair<std::string, std::string>> qa
{
{"Capital of US", "Washington"},
{"The baby in Family Guy", "Stewie"},
{"Capital of Texas", "Austin"}
};
std::vector<std::size_t> idx(qa.size());
std::iota(idx.begin(), idx.end(), 0u); // generate indexes
std::shuffle(idx.begin(), idx.end(), gen); // shuffle the indexes
// now display the elements in random order:
for (std::size_t i = 0; i < qa.size(); ++i)
{
std::cout << qa[idx[i]].first << ": "
<< qa[idx[i]].second << std::endl;
}
}
CCD_ 7保证了在所有可能的排列上的均匀分布。