2
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
#include <time.h>

unsigned long n = 1;

int main()
{
    int i = 0;
    std::string text = "I whip my hair back and forth";
    std::string wipIt = " ";
    size_t sz;
    sz = wipIt.size();
    srand(time(0));

    do{
        for(i = 0; i < 10; i++)
        {
            int randomNumber = rand() % 15 + 1;
            Sleep(50);
            wipIt.resize (sz++,' ');
            std::cout << wipIt;
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), randomNumber);
            std::cout << text << "\n";
        }
        for(i = 10; i > 0; i--)
        {
            int randomNumber = rand() % 15 + 1;
            Sleep(50);
            wipIt.resize (sz--,' ');
            std::cout << wipIt;
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), randomNumber);
            std::cout << text << "\n";
        }
    }
    while (n != 0);
    return 0;
}

如果我把这篇文章搞砸了,我很抱歉这只是我的第二篇文章。

使字符串中的每个字符具有不同颜色而不是整个字符串具有相同颜色的最简单方法是什么。

整理提示也将不胜感激:P

编辑:整理了一下,随机运行良好,谢谢大家^_^现在按字符着色?

4

3 回答 3

1

为什么看起来不是随机的?好吧,因为它不是。计算机使用伪随机数生成器来生成看似随机的数字,这些数字实际上是众所周知的和确定的。

伪随机发生器的初始状态称为“种子”;您必须每次将其设置为不同的值才能产生更接近随机的结果。在 C 中,您可以这样做:

srand(time(NULL));

这会将种子设置为每次调用时的实际时间(以秒为单位)。

于 2012-08-01T15:34:16.887 回答
1

为了按字符着色,您必须手动遍历字符串的字符并在输出每个字符之前设置颜色属性。

(下面的代码通过 迭代char。这不适用于实际使用多字节编码的字符集。为了支持这些,您必须使用 API 通过实际的用户感知字符而不是通过来迭代字符串char。)

此代码还有其他一些更改。

#include <iostream>
#include <string>
#include <random>

#include <Windows.h>

void colorize(size_t spacing, std::string const &s, std::mt19937 &eng) {
    std::cout << std::string(spacing, ' ');
    std::uniform_int_distribution<> dist(1,15);
    for (size_t i=0; i<s.size(); ++i) {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), dist(eng));
        std::cout << s[i];
    }
    std::cout << '\n';
}

int main() {
    std::string text = "I whip my hair back and forth";
    int sz = 0;

    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937 eng(seed);

    while (true) {
        int spacing = 11 - abs(10 - sz);
        sz = (sz+1) % 20;
        Sleep(50);
        colorize(spacing, text, eng);
    }
}

我将 C++11<random>库用于随机数,因为它比rand(). 它提供了许多现成的发行版,并且更难出错(rand() % 15 + 1即使rand()质量很高,也有轻微的偏差,但可能不是)。

我将重复的代码提取到一个函数中以消除重复。然后我用一个函数替换了两个 for 循环,该函数的 zigzag 输出与两个 for 循环对 sz 所做的完全匹配。

我将do {} while()无限循环替换为更具可读性和惯用的while(true){}.

我消除了为间距调整大小的字符串变量,以便在每次迭代时构造一个临时变量。这确实意味着每次迭代都可能有一个分配,而不是简单的调整大小(尽管小字符串优化可能会避免它),但在这种情况下性能无关紧要。

于 2012-08-01T16:48:19.683 回答
0

在首次使用之前,您需要为您的随机数生成器提供一个种子。

使用 srand 初始化随机数生成器的示例是:

/* srand example */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
  printf ("First number: %d\n", rand() % 100);
  srand ( time(NULL) );
  printf ("Random number: %d\n", rand() % 100);
  srand ( 1 );
  printf ("Again the first number: %d\n", rand() %100);

  return 0;
}
于 2012-08-01T15:30:07.423 回答