在开发 图片、短信验证码 中有这样的需求,生成的验证码 数字不能重复,网上封装的工具应该有,但自己想玩玩,有更好的想法在下面交流。
开始大家的思路可能都是,不断地去判断前面 已确认的数字,直到不与前面的重复,这个较坏的情况 就是 会出现不确定的长循环,比如,0-9,生成10位,第10个就剩一个可用数字,很难随机得到,就会进入长循环,复杂度可能大于n。
避免上述出现的循环,思路是只在可用的数字中随机,这样每次随机出来的数字 都可以直接拿走,复杂度n。
最终思路:在可用的字符数组中,把随机选中的字符 交换到前面,接下来的随机选取的范围 只在后面
代码:
public String RandomCode(int n) {char[] cs = {'0','1','2','3','4','5','6','7','8','9'};if(n > cs.length) {throw new RuntimeException(n+ "大于可以字符的长度 "+ cs.length);}for (int i = 0; i < n; i++) {int index = (int)(Math.random()*(cs.length-i))+i;char c = cs[i];cs[i] = cs[index];cs[index] = c;}return new String(cs, 0, n);}
