C++ 尝试从列表中随机选取一个元素并以C++;

C++ 尝试从列表中随机选取一个元素并以C++;,c++,list,C++,List,我是新来的,对编程非常陌生。我花了这么多时间浏览互联网和这个网站,似乎找不到我这个问题的答案。我需要从字符列表中随机选取一个元素并打印出来,然后重复用户输入的次数。我正在尝试制作一个文本生成器,用于使用单个键而不是单词进行打字练习。(是的,我知道我参加“正确键入”聚会已经很晚了,但我对编码的尝试让我发现这是一项比我想象的更有用的技能。) 到目前为止,我发现的答案大多是使用迭代器将列表中的所有元素打印成一行,这不是我想要的。我也经常遇到一些人说使用矢量而不是列表,但是我开始学习的C++书籍并没有涉

我是新来的,对编程非常陌生。我花了这么多时间浏览互联网和这个网站,似乎找不到我这个问题的答案。我需要从字符列表中随机选取一个元素并打印出来,然后重复用户输入的次数。我正在尝试制作一个文本生成器,用于使用单个键而不是单词进行打字练习。(是的,我知道我参加“正确键入”聚会已经很晚了,但我对编码的尝试让我发现这是一项比我想象的更有用的技能。)
到目前为止,我发现的答案大多是使用迭代器将列表中的所有元素打印成一行,这不是我想要的。我也经常遇到一些人说使用矢量而不是列表,但是我开始学习的C++书籍并没有涉及太多的“太高级”的东西,所以我被困在那里。虽然使用列表对我来说似乎是个好主意,但它可能只是我的初学者。数组对于我想要完成的任务来说过于僵硬,因为如果用户可以在这个程序的更高版本中输入他们想要的密钥,而不是像我第一次尝试时那样只编码它们,那就更理想了。 但无论如何,我的程序现在看起来是这样的:

// Version 1
// Text Generator for Typing Practice with Individual Keys:
//  For inputting into typing practice programs/sites with "insert your text" fields.
//   Generates a random list of letters from a list of known keys,
//    that only displays up to a user-entered amount of characters,
//     separated into paragraphs.

#include <iostream>
#include <cstdlib>
#include <list>
#include <ctime>

using namespace std;

int main () {

//Declare variables used below
int x = 0;
int list_size = 0;
int p = 0;

// Add new letters to the list below as you learn them!
list <char> Keys_Known = {' ', ' ', ' ', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 'e', 'r', 'u', 'i'};

// Define function(s) used below
char get_Text(); {
        for (int i = 0; i <= x; ++i) { // For x amount of times

            p = srand(time(nullptr)) % list_size;
            // Randomly choose a character from the list by its index,
            //  limited to the total number of elements in the list,

            cout << Keys_Known[p];
            //   and finally output the letter value of the index.
        }
    }

// Get and set list_size here
list_size = Keys_Known.size();

cout << "Enter total number of characters wanted: " << endl;
cin >> x;
// Set x to the total number of characters wanted in your practice text.
//  Maybe about 100 is good? ((Try with 10 for testing!))

cout << get_Text() << "/n" << get_Text() << "/n";
// Print two blocks of random text separated into paragraphs.

return 0;
}
//版本1
//用于使用单个键进行打字练习的文本生成器:
//用于输入带有“插入文本”字段的打字练习程序/站点。
//从已知密钥列表生成随机字母列表,
//仅显示最多用户输入的字符数,
//分成几段。
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
//声明下面使用的变量
int x=0;
int list_size=0;
int p=0;
//在学习时将新字母添加到下面的列表中!
列出键_Known={'','','a','s','d','f','g','h','j','k','l',';','e','r','u','i'};
//定义下面使用的功能
char get_Text(){
对于(int i=0;i
  • std::list
    不是随机访问容器。因此,您不能使用
    Keys\u Known[p]
    访问元素

    您可以使用数组或
    std::vector

    阵列可以很好地满足您的需要

  • 你试图做的事情不够清晰——至少意图还没有转化为代码。从中学习语言的基础知识会很有帮助

  • 这是您的代码,经过更新和注释。希望对您有所帮助

    #include <iostream>
    #include <cstdlib>
    #include <list>
    #include <ctime>
    
    using namespace std;
    
    int main () {
    
       //Declare variables used below
       int x = 0;
       int list_size = 0;
       int p = 0;
    
       // Add new letters to the list below as you learn them!
       char Keys_Known[] = {' ', ' ', ' ', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 'e', 'r', 'u', 'i'};
    
       // Seed the random number generator.
       srand(time(nullptr));
    
       // Get and set list_size here
       list_size = sizeof(Keys_Known)/sizeof(Keys_Known[0]);
    
       cout << "Enter total number of characters wanted: " << endl;
       cin >> x;
    
       // Define function(s) used below
    
       // Incorrect.
       // This will execute the code in the loop x+1 times.
       // for (int i = 0; i <= x; ++i) // For x amount of times
    
       // Correct. Choose one.
       // for (int i = 0; i = x; ++i) // For x amount of times
       for (int i = 1; i <= x; ++i) // For x amount of times
       {
    
          // Get a random number mod list_size..
          p = rand() % list_size;
    
          // Randomly choose a character from the list by its index,
          //  limited to the total number of elements in the list,
    
          cout << Keys_Known[p];
          // and finally output the letter value of the index.
       }
    
       cout << endl;
    
       return 0;
    }
    
    #包括
    #包括
    #包括
    #包括
    使用名称空间std;
    int main(){
    //声明下面使用的变量
    int x=0;
    int list_size=0;
    int p=0;
    //在学习时将新字母添加到下面的列表中!
    字符键_Known[]={'','','a','s','d','f','g','h','j','k','l',';','e','r','u','i'};
    //为随机数生成器设定种子。
    srand(时间(nullptr));
    //在此处获取并设置列表大小
    列表大小=sizeof(已知键)/sizeof(已知键[0]);
    cout x;
    //定义下面使用的功能
    //不对。
    //这将在循环中执行代码x+1次。
    
    //对于(int i=0;i这里发生了两件事:

    正如ÖöTiib所提到的,该函数为随机数生成器设定种子并返回
    void
    。您应该使用
    srand(unsigned int)
    为随机数生成器设定种子一次,然后调用以生成随机整数

    其次,不是随机访问容器,因此与其他容器不同,没有定义
    运算符[]
    。文档告诉我们,
    列表
    实现为双链接列表,旨在允许恒定时间的插入和删除,但缺少对给定位置元素的直接访问:

    列表和转发列表与其他列表相比的主要缺点 序列容器是指它们无法通过 它们的位置;例如,访问列表中的第六个元素, 必须从已知位置(如开始或结束)进行迭代 结束)到该位置,该位置在 这些

    无论如何,您可能不想在此处使用
    列表。一些更有效的选项是:

  • ,它确实定义了一个随机访问
    操作符[]
    ,可以用作代码中的替换项
  • ,它是一个
    char
    s的容器,还定义了
    运算符[]
  • 或者只是一个普通的
    char[list\u size]
    ,这就是完成这项工作真正需要的,也是我的建议:您不需要使用std容器获得的所有花哨的迭代器、搜索方法或动态分配

  • 但是SRAND是用于初始化生成器的虚函数。使用RAND()。注意,选项(3)依赖于可变长度数组,它们不是C++语言的一部分(尽管它们仍然可以工作,如果发问者正在使用编译器支持它们作为编译器特定的扩展——代码将不是可移植的)。