我正在尝试使用“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);
非常感谢您的帮助!
答案 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 - 1
但i < stringlength
下一个srand(time(NULL));
是不必要的。
真正的问题是您的随机值:您使用的是rand()%7+1
。 rand()%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;
}
关于代码的一些事情:
random
标题 - &gt;看看here math.h
)您通常不应该使用,除非有一些非常具体的原因,以及cXXXX版本(例如{{1} }})这是你通常应该使用的 。前者是C库,后者是C库,优化用于C ++,简称。它正确使用命名空间并具有微妙的实现差异等。通常,后者可以保证您不必使用原始C头。 cmath
你的方式来说,这不是一个好习惯,你可能想要谷歌搜索更多信息。