文章目录
不使用工具类
生成随机字符串,自己以前总是模模糊糊记得点,也没有认真的去搞过,有时候又会忘记,所以老老实实写吧;1.如何获取到一个随机数?
查了百度,看了很多文章,其中有几篇很好,我参考了,链接如下:
生成随机数文章1
a.常规生成随机数Math.random():
Math.random(),其范围是[0.0,1.0),
左闭右开:
以下是引用文章2内容:
调用这个Math.Random()函数能够返回带正号的double值,
取值范围是[0.0,1.0),在该范围内(近似)均匀分布。
因为返回值是double类型的,小数点后面可以保留15位小数,所以产生相同的可能性非常小,在这一定程度上是随机数。
其包是:
java.lang.Math.Random:
举例:
生成一个0-9之间的随机数:
Math.random()*10
一共是生成包括0到9之内的数字
b.常规生成随机数new Random():
有两种构造方式,如下也引用文章2:
下面Random()的两种构造方法:
Random():使用一个和当前系统时间对应的相对时间有关的数字作为种子数。
Random(long seed):直接传入一个种子数。
种子的作用是什么?
种子就是产生随机数的第一次使用值,机制是通过一个函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。以后产生的随机数都与前一个随机数有关
其包是:
java.util.Random:
举例:生成0-9之间的随机数
//1.指定种子值
Random r=new Random(100);
int a = random.nextInt(10);//产生[0,9]的随机数
int b = random.nextInt(10);
//2.不指定种子值
Random r=new Random();
int a = random.nextInt(10);//产生[0,9]的随机数
/*
区别在于,如果指定了种子数的话,
那么多次使用这个Random对象获得的随机数是一样的,
也就是说,其a==b
*/
c.使用System.currentTimeMillis()生成随机数
这个获得的是自:
1970-1-01 00:00:00.000 到当前时刻的时间距离,类型为long,单位为毫秒;
所以要使用这个来当随机数的话,一般都要转换成int;
举例:生成0-9之间的随机数
int randomNum = (int)(System.currentTimeMillis()%10);
对于这个System.currentTimeMillis()方法,其使用还可以参考文章:
获取当前毫秒值的使用
2.如何使用随机数生成随机字符串?
其方法参考了站长,站长网站如下;
站长网址
分析:
思路在于,让随机数出现的数字是一串定义好的字符串索引内的数字,然后根据随机生成的每一个数字索引,得到每一个字符串,然后拼接组合成一段随机字符串;
总结就是:
让随机生成的数作为字符串的索引,从而达到生成随机字符串的作用;
a.因为获取到的每一个随机索引的随机字符串要拼接到一起,所以需要一个能够存储拼接字符串的容器,而这个可以使用如下:
数组类型,String类型,StringBuffer类型,StringBuilder类型
暂时只晓得这四个。。。。。欢迎大家补充。。
基于性能和线程安全考虑,我采用StringBuffer类型;
b.解决了容器,接下来就是定义想要随机生成的字符串有哪些了;
其字符串看个人需求;
c.定义字符串,可以直接定义,例如:String a=“abcd”;
也可以使用ASCll表中,来定义;
我这采用ASCll表来使用;
对了,不记得某个数字或者英文字母的Ascll码值,可以转换成short类型来获取:
char a='B';
short s= (short) a;
char b='1';
short y= (short) b;
System.out.println("输出的是多少?"+s);//输出ASCll66
System.out.println("输出的是多少?"+y);//输出ASCLL49
生成随机字符串代码
方法一:
public static void main(String[] args) {
System.out.println("这样可以生成吗?"+method8(5));
}
/*
生成随机字符串方法一
* */
public static String method7(int n){
// 定义想要随机出现的字符串的容器
StringBuffer sb=new StringBuffer();
// 将字符串存储进容器
for (short i = 'a'; i <'z'; i++) {
sb.append((char)i);
}
for (short i = 'A'; i <'Z'; i++) {
sb.append((char)i);
}
for (short i = '1'; i <'9'; i++) {
sb.append((char)i);
}
// 定义用来存储随机生成字符串的容器
StringBuffer cunchu=new StringBuffer();
for (int i = 0; i < n; i++) {//其生成字符串的长度在于传递的数是多少
// 使用随机数方法生成随机数,其随机数是作为定义字符串的索引
int index = (int) (Math.random() * sb.length());
// 使用通过索引获取值方法charAt
cunchu.append(sb.charAt(index));
}
return cunchu.toString();
}
方法二:
第二个方式的思路是利用了,其short类型的数字可以直接代表了ascll码中符号,所以随机生成其ascll码的数字大小,就可以获取符号,然后再拼接,这样也可以获取随机字符串;
代码如下:
public static void main(String[] args) {
System.out.println("这样可以生成吗?"+method8(5));1
}
public static String method8(int n){
// 定义用来存储随机生成字符串的容器
StringBuffer cunchu=new StringBuffer();
// 定义随机要生成的字符串
// 在Ascll码中,0到z之间包含了大小写和数字,但是还包含了其它符号
short start='0';
// 这里加1是因为其Math.Random是一个左闭右开的集合,要包括小写z
short end='z'+1;
// 在指定的生成几位数的循环中
for (int i = 0; i < n; i++) {
/*
* 这个while(true)循环必须要有
* 假设外循环为5次
* 那么假设我五次都没有找到一个数字或者字母,那。。
* 容器里面岂不是为null。。。。因而言必须要有内循环
* */
while(true){
// 获取ascll码中48到122中代表的字符,即0到z
char result= (char) (Math.random()*((end-start)+start));
// 判断是否为字母或者为数字,如果是就拼接到容器中
if(Character.isLetter(result)||Character.isDigit(result)){
cunchu.append(result);
break;
}
}
}
return cunchu.toString();
}
使用工具
这个,先欠着。。。未完待续;