读书人

请帮看看有上面的方法产生一个随机字

发布时间: 2012-11-01 11:11:33 作者: rapoo

请帮看看,有下面的方法产生一个随机字符,为什么第二次调用时就会死了?
想附机的产生一个字符(的串),如“A” 或“w”,但要调用多次,且为了避免重复,加了个排除strExclude,如果得到的字串在此字符串内存在,就再生成一个,直到不在strExclude串中:

private String GetRandomCharString(String strExclude){
Random randGen = null;
char[] numbersAndLetters = null;

if (randGen == null)
{
randGen = new Random();
numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
}
char randC;
String randStr="";
while(strExclude.indexOf(randStr)>0){
randC = numbersAndLetters[randGen.nextInt(61)];
randStr=String.valueOf(randC);
}
return randStr;
}

[解决办法]
把while部分换成do...while就好了,你现在的写法,while循环是永远也不会执行的.
下面是代码.

Java code
public static String GetRandomCharString(String strExclude) {        Random randGen = null;        char[] numbersAndLetters = null;        if (randGen == null) {            randGen = new Random();            numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")                    .toCharArray();        }        char randC;        String randStr = "";        do {            randC = numbersAndLetters[randGen.nextInt(61)];            randStr = String.valueOf(randC);        } while (strExclude.indexOf(randStr) > 0);        return randStr;    }
[解决办法]
这个方法里没有必要声明那么多变量,可以把Random和字符数组声明在方法外进行缓存,不用每次都创建一个新对象,我帮你重新改了一下代码,你可以参考一下.

Java code
import java.util.Random;public class Demo {        public static void main(String[] args) {        String str = "";        for(int i = 0; i < 15; i++) {            str += GetRandomCharString(str);        }        System.out.println(str);    }    private static Random randGen = new Random();;    private static char[] numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")            .toCharArray();    public static String GetRandomCharString(String strExclude) {        char randC;        do {            randC = numbersAndLetters[randGen.nextInt(61)];        } while (strExclude.indexOf(randC) > 0);        return String.valueOf(randC);    }}
[解决办法]
这里边存在死循环的可能性,如果你所要的随机字符串长度大于numbersAndLetters数组的长度就会出现死循环,所以要在while加一个条件

Java code
while (strExclude.indexOf(randC) > 0 && [color=#FF0000]strExclude.length < numbersAndLetters.length[/color]);
[解决办法]
在进入while循环之前应该要先执行:
randC = numbersAndLetters[randGen.nextInt(61)];
randStr=String.valueOf(randC);
这两句吧,否则randStr不是一直为空串么?

读书人网 >Android

热点推荐