乱码生成器

· · 科技·工程

肯定会有人说这个乱码生成器华而不实,但我有必要在此申明一下,这只是一个好玩的搞怪代码。

全谷第一个乱码生成器保姆级教程完成,做一个独属于自己的乱码生成器。

〇、前言

现在看到一些乱码生成器。
但……

char c;
for (int i = 0; i < 100; i ++)
{
    c = rand () % 100000;
    if (c != 7) cout << c;
}
cout << endl;

作者作者这太简陋了吧!?

所以有了这篇文章。

一、基础代码

前置知识

rand 随机数函数 | ASCII 码

1.随机的混沌

随机的字符串源于随机的字符,随机的字符源于随机的数字,随机的数字源于随机的 rand()。

我们只要将随机数取模,得到随机的字符,最后将其输出。
(实现代码)

srand (time (NULL));
while (true) cout << (char)(rand () % 128);

2.参差的每行

显然,前一种方法显示的乱码可谓铺天盖地,美观指数十分糟糕。对于这种情况,我们可以换行解决。

使用双重循环,第一重遍历无数行,第二重遍历每行的随机列,作者个人认为每行取值 1100 较为合适。
(实现代码)

srand (time (NULL));
while (true)
{
    for (long long i = 1; i <= rand () % 100 + 1; i ++) cout << (char)(rand () % 128);
    cout << endl;
}

3.随机换行数

运行之后发现它还是十分紧密,解决的方法就是多换几行。

换的行数值得考虑,作者取的是 13 行。
(实现代码)

srand (time (NULL));
while (true)
{
    for (long long i = 1; i <= rand () % 100 + 1; i ++) cout << (char)(rand () % 128);
    for (long long i = 1; i <= rand () % 3 + 1; i ++) cout << endl;
}

4.随机空格数

竖向舒展了,但横向照样紧凑。
Dalao:加空格!

没错,再在代码中加入空格的程序。
每行中多加一重循环,每次循环字符与空格出现的几率都为 \frac{1}{2}
(实现代码)

srand (time (NULL));
while (true)
{
    for (long long i = 1; i <= rand () % 100 + 1; i ++)
    {
        int x = rand () % 2;
        if (x == 0)
            for (long long i = 1; i <= rand () % 100 + 1; i ++) cout << (char)(rand () % 128);
        if (x == 1)
            for (long long i = 1; i <= rand () % 10 + 1; i ++) cout << ' ';
    }
    for (long long i = 1; i <= rand () % 3 + 1; i ++) cout << endl;
}

5.另起一类的数字

旧的问题解决了,新的问题随之而来,数字十分稀少,出现的几率仅为 \frac{5}{64}

如题,我们可以新建一类,将数字、字符、空格出现的几率都调为 \frac{1}{3}
(实现代码)

srand (time (NULL));
while (true)
{
    for (long long i = 1; i <= rand () % 100 + 1; i ++)
    {
        int x = rand () % 3;
        if (x == 0) cout << rand ();
        if (x == 1)
            for (long long i = 1; i <= rand () % 100 + 1; i ++) cout << (char)(rand () % 128);
        if (x == 2)
            for (long long i = 1; i <= rand () % 10 + 1; i ++) cout << ' ';
    }
    for (long long i = 1; i <= rand () % 3 + 1; i ++) cout << endl;
}

到这里基础代码就解决了,想美化的可以看下一部分。

二、美化

前置知识

颜色更改 | 等待时间函数

1.输出美化

单一的黑白根本就不,为了让它更一点,我们可以加上鬼畜的颜色。
(功能代码)

SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), rand () % 16);

但是这又令人眼花缭乱,为了杜绝这种情况,我们可以根据字符对症下药:
(作者所写)

(实现代码)

srand (time (NULL));
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
while (true)
{
    for (long long i = 1; i <= rand () % 100 + 1; i ++)
    {
        int x = rand () % 3;
        if (x == 0)
        {
            SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
            cout << rand ();
            SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
        }
        if (x == 1)
            for (long long i = 1; i <= rand () % 100 + 1; i ++)
            {
                char s = (char)(rand () % 128);
                if (s == '+' || s == '-' || s == '*' || s == '/' || s == '%' || s == '^') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
                else if (s == '!' || s == '~' || s == '|' || s == '&' || s == '?') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_BLUE);
                else if (s == '=') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
                else if (s == ':' || s == ';' || s == '[' || s == ']' || s == '{' || s == '}') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED);
                else if (s == '>' || s == '<') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE);
                else if (s == '\\' || s == '\'' || s == '\"') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
                else if (s == '#') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY);
                else if (s >= '0' && s <= '9') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
                cout << s;
                SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
            }
        if (x == 2)
            for (long long i = 1; i <= rand () % 10 + 1; i ++) cout << " ";
        for (long long i = 1; i <= rand () % 3 + 1; i ++) cout << endl;
    }
}

2.时间等待

颜色问题解决了,接下来写延迟输出的代码。

这其实 so easy,因为我们可以直接等待随机毫秒。
(功能代码)

Sleep (rand () % 1000);

最后加入至代码中。
(实现代码)

srand (time (NULL));
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
while (true)
{
    for (long long i = 1; i <= rand () % 100 + 1; i ++)
    {
        int x = rand () % 3;
        if (x == 0)
        {
            SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
            cout << rand ();
            Sleep (rand () % 3);
            SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
        }
        if (x == 1)
            for (long long i = 1; i <= rand () % 100 + 1; i ++)
            {
                char s = (char)(rand () % 128);
                if (s == '+' || s == '-' || s == '*' || s == '/' || s == '%' || s == '^') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
                else if (s == '!' || s == '~' || s == '|' || s == '&' || s == '?') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_BLUE);
                else if (s == '=') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
                else if (s == ':' || s == ';' || s == '[' || s == ']' || s == '{' || s == '}') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED);
                else if (s == '>' || s == '<') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE);
                else if (s == '\\' || s == '\'' || s == '\"') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
                else if (s == '#') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY);
                else if (s >= '0' && s <= '9') SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
                cout << s;
                Sleep (rand () % 3);
                SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
            }
        if (x == 2)
        {
            for (long long i = 1; i <= rand () % 10 + 1; i ++)
            {
                cout << " ";
                Sleep (rand () % 3);
            }
        }
        Sleep (rand () % 10);
    }
    for (long long i = 1; i <= rand () % 3 + 1; i ++)
    {
        cout << endl;
        Sleep (rand () % 3);
    }
}

乱码生成器的教程到这里就结束了,如果觉得还可以,那么请点个赞吧。