返回一个随机字符串

时间:2016-02-16 16:34:38

标签: c++ string

我正在尝试使用“ABCDEFG”或更少(取决于难度(将成为游戏))制作随机字符串,但我的代码一直给我错误,如“多重定义”,“首先在此定义”。

我对C ++的经验太少(以前只在Java工作,而app appor ..)所以我想我在这里缺少一些关于字符串/字符/函数的c ++基本规则。

这是我的代码:

Animator scaleDown = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 1, 0), PropertyValuesHolder.ofFloat("scaleY", 1, 0));
scaleDown.setDuration(300);
scaleDown.setInterpolator(new OvershootInterpolator());

Animator scaleUp = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 0, 1), PropertyValuesHolder.ofFloat("scaleY", 0, 1));
scaleUp.setDuration(300);
scaleUp.setStartDelay(300);
scaleUp.setInterpolator(new OvershootInterpolator());

LayoutTransition itemLayoutTransition = new LayoutTransition();
itemLayoutTransition.setAnimator(LayoutTransition.APPEARING, scaleUp);
itemLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, scaleDown);

ViewGroup av = (ViewGroup)v.findViewById(R.id.animated_layout);
av.setLayoutTransition(itemLayoutTransition);

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

为什么要包含这么多不需要的头文件?这些应该足够了:

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

你应该避免using namespace std;。如果您不想每次都输入std::string,尤其是您可以使用using std::string;

using std::string;
using std::cout;
using std::endl;

现在你的功能。

为避免编译器警告,我建议将srand(time(NULL));更改为srand(static_cast<unsigned int>(time(NULL)));

你的循环没问题,但你通常不会写i <= stringlength - 1i < stringlength

下一个srand(time(NULL));是不必要的。

真正的问题是您的随机值:您使用的是rand()%7+1rand()%7会给你一个范围[0,6]的值,这可以,但是通过添加1,范围移动到[1; 7]而7超出你的范围lettersToUse字符串。

为了安全起见,您应该将范围限制为实际可访问的范围。在您的情况下,lettersToUse.size()为7。正如我们在rand()%7之前看到的那样,为您提供了正确的范围。因此,只要rand()%lettersToUse.size()不是lettersToUse.size()0就一定会好的。

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using std::string;
using std::cout;
using std::endl;


string createRandomString(int);

int main() {

    string test;
    test = createRandomString(1);
    cout << test;
    return 0;

}


string createRandomString(int stringlength) {

    srand(static_cast<unsigned int>(time(NULL)));

    string lettersToUse = "ABCDEFG";
    string newOne = "";

    for (int i = 0; i < stringlength - 1; i++) {
        newOne += lettersToUse[rand() % lettersToUse.size()];
    }
    return newOne;
}

如果您尝试修改lettersToUse或甚至允许用户指定lettersToUse,您应该定义添加letterToUse大小的检查,因为程序会在#39}时崩溃;空了。

如果您可以使用C ++ 11,我建议使用它提供的C ++随机数生成器:

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

using std::string;
using std::cout;
using std::endl;


string createRandomString(int);

int main() {

    string test;
    test = createRandomString(5000);
    cout << test;
    return 0;

}


string createRandomString(int stringlength) {
    string lettersToUse = "ABCDEFG";
    string newOne = "";

    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(0, lettersToUse.size()-1); //Range from [0-6], when size is 7: 0-6 = 7 elements

    for (int i = 0; i < stringlength - 1; i++) {
        newOne += lettersToUse[distribution(generator)];
    }
    return newOne;
}

根据大写的建议,这里是使用std::generate_n的版本:

#include <iostream>
#include <string>
#include <random>
#include <algorithm>
#include <iterator>

using std::string;
using std::cout;
using std::endl;


string createRandomString(int);

int main() {

    string test;
    test = createRandomString(1);
    cout << test;
    return 0;

}


string createRandomString(int stringlength) {
    string lettersToUse = "ABCDEFG";

    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(0, lettersToUse.size() - 1); //Range from [0-6], when size is 7: 0-6 = 7 elements

    string newOne;
    newOne.reserve(stringlength);
    std::generate_n(std::back_inserter(newOne), newOne.capacity(), [&lettersToUse, &distribution, &generator]() { return lettersToUse[distribution(generator)]; });

    return newOne;
}

答案 1 :(得分:0)

在你的循环中_faqs_path每次给你相同的随机值。什么是srand(time(NULL));用于?我也删除了头文件。

这是您的完整代码:此函数生成随机字符串。

#include "Functions.h"
  

<强>输出:         DFEEDD

答案 2 :(得分:-1)

关于你的错误我不能说什么,因为你没有提到它们。关于如何创建一个随机字符串,已经问过here,我粘贴了Ates Goral代码,我觉得这是最简单的:

void gen_random(char *s, const int len) {
    static const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0; i < len; ++i) {
        s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
    }

    s[len] = 0;
} 

关于代码的一些事情:

  • 你使用了很多C库。这是你应该尽可能避免的事情IMO - 你在C ++中,所以使用C ++功能..例如,在C ++中有random标题 - &gt;看看here
  • 当您包含C库时,请注意您包含的版本。在C ++中,您有两个选项,XXX.h标题(例如math.h您通常不应该使用,除非有一些非常具体的原因,以及cXXXX版本(例如{{1} }})这是你通常应该使用的 。前者是C库,后者是C库,优化用于C ++,简称。它正确使用命名空间并具有微妙的实现差异等。通常,后者可以保证您不必使用原始C头。
  • 对于cmath你的方式来说,这不是一个好习惯,你可能想要谷歌搜索更多信息。