我需要创建一个长度在 6 到 10 之间的随机字符串,但有时它只生成大约 3 到 5 的长度。
这是我的代码。任何人都可以找出问题所在吗? :(
int lengthOfName = (int)(Math.random() * 4) + 6;
String name = "";
/* randomly choosing a name*/
for (int j = 0; j <= lengthOfName; j++) {
int freq = (int)(Math.random() * 100) + 1;
if(freq <= 6){
name += "a";
}if(freq == 7 && freq == 8){
name += "b";
}if(freq >= 9 && freq <= 11){
name += "c";
}if(freq >= 12 && freq <= 15){
name += "d";
}if(freq >= 16 && freq <= 25){
name += "e";
}if(freq == 26 && freq == 27){
name += "f";
}if(freq == 28 && freq == 29){
name += "g";
}if(freq >= 30 && freq <= 33){
name += "h";
}if(freq >= 34 && freq <= 48){
name += "i";
}if(freq == 49 && freq == 50){
name += "j";
}if(freq >= 51 && freq <= 55){
name += "k";
}if(freq >= 56 && freq <= 60){
name += "l";
}if(freq == 61 && freq == 62){
name += "m";
}if(freq >= 63 && freq <= 70){
name += "n";
}if(freq >= 71 && freq <= 75){
name += "o";
}if(freq == 76 && freq == 77){
name += "p";
}if(freq == 78){
name += "q";
}if(freq >= 79 && freq <= 84){
name += "r";
}if(freq == 85 && freq == 86){
name += "s";
}if(freq == 87 && freq == 88){
name += "t";
}if(freq >= 89 && freq <= 93){
name += "u";
}if(freq == 94){
name += "v";
}if(freq == 95 && freq == 96){
name += "w";
}if(freq == 97){
name += "x";
}if(freq == 98 && freq == 99){
name += "y";
}if(freq == 100){
name += "z";
}
}
抱歉,代码写得太差,无法挽救。我推荐这样的东西。
Random r = new Random(); // just create one and keep it around
String alphabet = "abcdefghijklmnopqrstuvwxyz";
final int N = 10;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
sb.append(alphabet.charAt(r.nextInt(alphabet.length())));
}
String randomName = sb.toString();
System.out.println(randomName);
要点是:
- Use java.util.Random http://java.sun.com/javase/6/docs/api/java/util/Random.html, specifically
nextInt(int n)
to get a random int
in a given range
- 在循环中构建字符串时,使用
StringBuilder
.
- 使用字母字符串,并且
charAt
来索引它的字母。
API链接
-
java.util.Random http://java.sun.com/javase/6/docs/api/java/util/Random.htmlhttp://java.sun.com/javase/6/docs/api/java/util/Random.html
-
int nextInt(int n) http://java.sun.com/javase/6/docs/api/java/util/Random.html#nextInt%28int%29
- 返回 0(含)和指定值(不含)之间均匀分布的伪随机 int 值
-
StringBuilder http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html- 可变的字符序列。
相关问题
- 字符串与 StringBuilder (C#) https://stackoverflow.com/questions/73883/string-vs-stringbuilder
- 字符串、StringBuffer 和 StringBuilder (Java) https://stackoverflow.com/questions/2971315/string-stringbuffer-and-stringbuilder/
原来的代码有问题
不幸的是,有很多。
-
String +=
对于较长的字符串,循环中的性能非常差
-
for (int j = 0; j <= lengthOfName; j++)
is an 差一误差 http://en.wikipedia.org/wiki/Off-by-one_error
-
freq == 7 && freq == 8
是一个逻辑矛盾
- It's just unnecessarily verbose!
我强烈建议做大量小而简单的练习来学习 Java 基础知识。编码蝙蝠网站 http://codingbat.com/java是很棒的;它有数百个,它们会自动评分,因此您会知道您的解决方案何时按预期工作。它有关于逻辑、字符串、数组等的部分。
关于字母分布不均匀
最简单的解决方案是在字母表中只包含重复项:
-
String alphabet = "aab";
将有概率为a
两倍b
- You can generate the
alphabet
programmatically from a frequency table
- 我将把这个作为练习(或者如果你需要的话你可以问另一个问题)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)