带有随机数的 C++ 字符串练习

C++ String excercise with random numbers

我必须做这个练习:

A common punishment for school children is to write out the same sentence multiple times. Write a C++ stand-alone program that will write out the following sentence one hundred times: “I will always use objectoriented design.” Your program should number each of the sentences and it should “accidentally” make eight different random-looking typos at various points in the listing, so that it looks like a human typed it all by hand.

我的知识仅限于 C 个随机数。我试过这个但没有成功。我不能得到 8 个错误。如我们所见,"typo".

出现随机错误

这是我的错误代码:

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
    string strPunish = "I will always use objectoriented design.";
    int randFrom = 1;
    int randTo = 100;
    int typoCounter = 0;
    srand(time(NULL));
    int randNumber = randFrom + ( std::rand() % ( randTo - randFrom + 1 ) );
    for (int i = 1; i <= 100; i++)
    {
        if ((i == randNumber) && (typoCounter != 8))
        {
            randFrom = i;
            randNumber = randFrom + ( std::rand() % ( randTo - randFrom + 1 ) );
            string strTypo = strPunish;
            int randTypo = 0 + ( std::rand() % ( strTypo.length() - 0 + 1 ) );
            strTypo.insert(randTypo, "TYPO");
            cout << i << ": " << strTypo << endl;
            typoCounter++;
        }   
        else
            cout << i << ": " << strPunish << endl;
    }
    return EXIT_SUCCESS;
}

我已经为你制作了整个程序:

#include <iostream>
#include <ctime>

void selectionSort(int[], int);

int main(void)
{
    std::string punishStr = "I will always use objectoriented design."; // declaration
    std::string tempStr = punishStr;
    std::string typoStr = "TYPO";
    int length = punishStr.length();
    int location = 0;
    short int count = 0;
    int randoms[8] = {0};

    srand(time(0)); // generates random different times

    for (int i = 0; i < 8; i++)
    {
        randoms[i] = (rand() % 100) + 1; // creates 8 random numbers
    }

    selectionSort(randoms, 8); // sorts random numbers, for sake of being unbiased

    for (int i = 0; i < 100; i++)
    {
        if (randoms[count] == i && count <= 8) // random number equals i
        {
            punishStr = tempStr;
            location = (rand() % length) + 1;
            std::cout << (i + 1) << ": " << punishStr.insert(location, typoStr) << std::endl;
            count++;
        }
        else
            std::cout << (i + 1) << ": " << tempStr << std::endl;
    }

    return 0;
}

void selectionSort(int a[], int n) // sorting algorithm
{
    int i, j, min, temp;

    for (i = 0; i < n - 1; i++)
    {
        min = i;
        for (j = i + 1; j < n; j++)
            if (a[j] < a[min])
                min = j;

        temp = a[i];
        a[i] = a[min];
        a[min] = temp;
    }
}

程序首先声明了一些必要的变量,包括所需的八个零随机数。然后,通过For循环,它重新定义了范围在1-100之间的随机数的所有8个数组元素。

在那之后,它简单地对数组进行排序(否则它会产生偏差,例如 54、32...),为了防止它,我们简单地将它排序为 32、54...。此后,它检查计数器变量是否 <= 8,如果是,则递增并显示拼写错误的句子。否则,显示正确的句子。

它会一遍又一遍地重复,直到 i 小于 100。

希望对你有用。

注意:输出这么大,最好自己检查一下。 :-)

如上所说,既然是自己的作业,就自己解决吧。但我会为您提供一些可能改进代码的线索:

  1. 首先,您应该将您的代码分成小函数 - 这将使它更具可读性,也更容易理解!
  2. 创建一个所有数字都在 [0, 99] 范围内的数组更容易,将其打乱,然后只选择前 X 行进行处理(其中 X 可以是任何内容!)。查看 std::arraystd::shuffle 了解更多信息。
  3. 不要在代码中使用硬编码数字!您应该改为定义 constexpr 变量 - 这将使您的代码更具可读性(还记得 (1) 吗?)
  4. Extra:不再常用randsrand,取而代之的是最好使用 <random> 中的 std::mt19937。此外,更常见的用法是 <chrono> 而不是 <ctime>.

备注:注意你需要确保你选择的行号是唯一的;确保它(可能不会永远卡住)的最快方法是按照我在 (2).

中的建议进行操作