本文共 3805 字,大约阅读时间需要 12 分钟。
文章目录
不使用工具类
生成随机字符串,自己以前总是模模糊糊记得点,也没有认真的去搞过,有时候又会忘记,所以老老实实写吧;1.如何获取到一个随机数?
查了百度,看了很多文章,其中有几篇很好,我参考了,链接如下:
其有一点很重要,java中的随机数也确实是伪随机数。。。。。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(); }
使用工具
这个,先欠着。。。未完待续;
转载地址:https://blog.csdn.net/qq_45321679/article/details/112171930 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!