如何从C++;? 我正在用C++编写一个问答游戏。所以,主要的要求是,每次程序运行时,应该从文件中随机抽取问题。那么,我怎么才能在C++中做到这一点呢? 考虑下面两个简单的程序。< /P>

如何从C++;? 我正在用C++编写一个问答游戏。所以,主要的要求是,每次程序运行时,应该从文件中随机抽取问题。那么,我怎么才能在C++中做到这一点呢? 考虑下面两个简单的程序。< /P>,c++,file,ifstream,information-retrieval,ofstream,C++,File,Ifstream,Information Retrieval,Ofstream,Write.cpp #include <iostream> #include <fstream> #include <string> using std::cout; using std::ofstream; using std::string; int main() { ofstream fout("test.txt"); if(!fout) cout<<"Error in opening file"; s

Write.cpp

#include <iostream>
#include <fstream>
#include <string>
using std::cout;
using std::ofstream;
using std::string;
int main()
{
    ofstream fout("test.txt");
    if(!fout)
        cout<<"Error in opening file";
    string s[3];
    s[0]="C++ provides object oriented string handling";
    s[1]="C++ provides object oriented exception handling";
    s[2]="C++ provides highest flexibility to the programmer";
    for(int i=0;i<3;i++)
        fout<<s[i]<<'\n';
    fout.close();
}
#include <iostream>
#include <fstream>
#include <string>
using std::cout;
using std::string;
using std::ifstream;
int main()
{
    ifstream fin("test.txt");
    if(!fin)
        cout<<"Error in opening file";
    string s[3];
    for(int i=0;i<3;i++)
        getline(fin,s[i]);
    for(int i=0;i<3;i++)
        cout<<s[i]<<'\n';
    fin.close();
}
#包括
#包括
#包括
使用std::cout;
使用std::of流;
使用std::string;
int main()
{
流fout(“test.txt”);
如果(!fout)

cout如果要按照从文件中读取字符串的顺序维护字符串数组

您可以通过创建另一个包含数字[1,2..n-1](其中n是字符串的数量)的整数数组,然后将其洗牌以获得随机索引序列,您可以使用该序列打印字符串

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>

using std::cout;
using std::string;
using std::ifstream;

int main()
{
    ifstream fin("test.txt");
    if(!fin)
        cout<<"Error in opening file";

    std::vector<string> lines;
    string line;
    while (getline(fin, line))
          lines.push_back(line);

    // Create a std::vector containing {1, 2 .. n-1} 
    // and shuffle it to obtain a random ordering.
    std::vector<int> order;
    for (int i = 0; i < lines.size(); ++i)
    {
       order.push_back(i);
    }

    // C++11
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // Seed from current time.
    auto engine = std::default_random_engine{seed}; // You may also want to look into uniform_int_distribution.
    std::shuffle(std::begin(order), std::end(order), engine);

    // C++98
    // std::random_shuffle(order.begin(), order.end());

    // Prints strings in random order.
    for (int number : order)
         cout << lines[number] <<'\n';

    fin.close();
}
#包括
#包括
#包括
#包括

#如果要按照从文件中读取字符串的顺序维护字符串数组,请包括

您可以通过创建另一个包含数字[1,2..n-1](其中n是字符串的数量)的整数数组,然后将其洗牌以获得随机索引序列,您可以使用该序列打印字符串

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>

using std::cout;
using std::string;
using std::ifstream;

int main()
{
    ifstream fin("test.txt");
    if(!fin)
        cout<<"Error in opening file";

    std::vector<string> lines;
    string line;
    while (getline(fin, line))
          lines.push_back(line);

    // Create a std::vector containing {1, 2 .. n-1} 
    // and shuffle it to obtain a random ordering.
    std::vector<int> order;
    for (int i = 0; i < lines.size(); ++i)
    {
       order.push_back(i);
    }

    // C++11
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // Seed from current time.
    auto engine = std::default_random_engine{seed}; // You may also want to look into uniform_int_distribution.
    std::shuffle(std::begin(order), std::end(order), engine);

    // C++98
    // std::random_shuffle(order.begin(), order.end());

    // Prints strings in random order.
    for (int number : order)
         cout << lines[number] <<'\n';

    fin.close();
}
#包括
#包括
#包括
#包括

#include

最简单的解决方案是将行放入
std::list
,然后使用
std::random\u shuffle
对它们进行随机排序:

#include <algorithm>    // std::random_shuffle
#include <list>         // std::list
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand
std::list<std::string> str_list;
std::string buf_str;

for(int i=0;i<3;i++){
  getline(fin,buf_str);
  str_list.push_back(buf_str);
}
std::srand(std::time(0));
std::random_shuffle ( str_list.begin(), str_list.end() );
// then just print lines from str_list
\include//std::random\u shuffle
#include//std::list
#包括//标准::时间
#包括//std::rand、std::srand
std::list str_list;
std::字符串buf_str;

对于(int i=0;i而言,最简单的解决方案是将行放入
std::list
,然后使用
std::random\u shuffle
对它们进行随机排序:

#include <algorithm>    // std::random_shuffle
#include <list>         // std::list
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand
std::list<std::string> str_list;
std::string buf_str;

for(int i=0;i<3;i++){
  getline(fin,buf_str);
  str_list.push_back(buf_str);
}
std::srand(std::time(0));
std::random_shuffle ( str_list.begin(), str_list.end() );
// then just print lines from str_list
\include//std::random\u shuffle
#include//std::list
#包括//标准::时间
#包括//std::rand、std::srand
std::list str_list;
std::字符串buf_str;


对于(int i=0;我能为您的问题添加更多详细信息吗?您尝试了什么?@Ilya:我已经提供了足够的问题详细信息。您还需要什么?如果文件的每一行都是可能的目标字符串,并且您知道文件中的总行数,您可以从范围
1..line\u count
中生成3个随机数,然后迭代粗略地整理您的文件并存储与随机生成的每一行对应的每一行number@Ploutox:如果你写一个答案并用程序解释会更好。@PravasiMeet,现在还不清楚,你有算法或技术问题。你需要描述能以随机顺序显示数组字符串的算法吗?还是需要D信息如何在C++中获得随机值?你能添加更多关于你的问题的细节吗?你尝试了什么?”ILYA:我已经提供了关于我的问题的足够细节。你还需要什么?如果文件的每一行都是一个可能的目标字符串,并且你知道文件中的行数,你可以从范围<代码> 1生成3个随机数。.line_count
,然后遍历文件并存储与随机生成的每一行对应的每一行number@Ploutox:如果你写一个答案并用程序解释会更好。@PravasiMeet,现在还不明显,你有算法或技术问题吗。你需要描述能显示字符串的算法吗你需要信息吗?或者你需要信息如何在C++中获得随机值?我尝试了你的解决方案,但是每次都得到相同的输出。看起来字符串不是随机显示的。如果你使用C++ 11标准,考虑使用<代码> Suffle < /C> >代替<代码> RealthSuffle 。e
这比
random\u shuffle
@PravasiMeet随机性要大得多。我添加了从当前时间获得的种子。请尝试一下。我还添加了一个指向可以在线测试的片段的链接。@Nishant没有显式提供种子,
default\u random\u引擎
使用默认种子。因此它确实生成了相同的序列数字的e(起初我忽略了它)我尝试了你的解决方案,但是每次我都得到相同的输出。看起来字符串不是随机显示的。如果你使用C++ 11标准,考虑使用<代码> Suffle < /C> >代替<代码> RealthySuffle 。添加了C+ 11版本,<代码> Suffle ,这是非常随机的,<代码> RouthSuffle < /Calp> @ Prava.siMeet我添加了从当前时间获得的种子。请试用。我还添加了一个链接,指向一个可以在线测试的代码段。@Nishant在没有明确提供种子的情况下,
default\u random\u engine
使用默认种子。因此它确实生成了相同的数字序列(我一开始忽略了它)。