尝试从列表中随机选择一个元素并以C ++显示

时间:2018-08-27 03:01:41

标签: c++ list

我是这里的新手,并且对编程非常陌生,而且在我花时间搜寻互联网和此站点的所有时间中,我似乎都找不到我的这个问题的答案。我需要从字符列表中随机选择一个元素并将其打印出来,然后以用户输入的次数重复此操作。我正在尝试制作一个文本生成器,用于使用单个键而不是单词进行打字练习。 (是的,我知道我参加“正确键入”聚会的时间太晚了,但是我对编码的尝试使我看到它比我想象的要有用。)
到目前为止,我基本上已经找到了使用迭代器来连续打印列表中所有元素的答案,这不是我想要的。我还经常遇到人们说使用向量而不是列表的情况,但是我开始学习的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;
}

我不断在int p和int list_size的类型上遇到错误,而%s不起作用,这通常是我限制随机数范围的方式。 Eclipse还告诉我,我什么也不能说'Keys_Known []',因为它不知道[]应该意味着什么。我什至尝试在其中放置一个0,但它仍然表现为无法使用索引。我是否缺少'#include'标头? 我得到的确切错误是:
“对于二进制'operator%'第29行C / C ++问题,类型为'void'和'int'的类型无效的操作数”
和:
“与'operator []'不匹配(操作数类型为'std :: __ cxx11 :: list'和'int')第33行C / C ++问题”

任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:0)

  1. std::list不是随机访问容器。因此,您可能无法使用Keys_Known[p]来访问元素。

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

    一个数组可以很好地满足您的需求。

  2. 您尝试做的事情不够清晰-至少意图没有翻译成代码。从a good book了解该语言的基础知识将很有帮助。

这是您的代码,已更新并带有注释。希望对您有所帮助。

#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;
}

答案 1 :(得分:0)

这里发生了几件事:

如ÖöTiib所述,函数srand(unsigned int)为随机数生成器播种并返回void。您应该使用srand(unsigned int)为随机数生成器添加一次种子,然后调用rand()生成随机整数。

第二,list<T>不是随机访问容器,因此与其他容器不同,没有定义operator[]。该文档告诉我们list<T>是作为双链表实现的,旨在允许进行恒定时间的插入和删除,但是无法直接访问给定位置的元素:

  

列表和转发列表与其他列表相比的主要缺点   序列容器是它们无法通过以下方式直接访问元素   他们的位置;例如,要访问列表中的第六个元素,   一个人必须从一个已知的位置进行迭代(例如开始或结束)   结束)到该位置,这需要花费线性时间   这些。

您可能还是不想在这里使用list<char>。一些更有效的选择是:

  1. vector<char>,它确实定义了随机访问权限operator[],并且可以用作代码中的直接替代;
  2. string,它是由char定义的operator[]的容器;
  3. 或者只是一个普通的char[list_size],这是您完成工作所需的全部内容,也是我的建议:您不需要所有花哨的迭代器,搜索方法或动态分配使用std容器得到的结果。