博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杂文之生成随机字符串
阅读量:3963 次
发布时间:2019-05-24

本文共 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(); }

使用工具

这个,先欠着。。。未完待续;

转载地址:http://gdgzi.baihongyu.com/

你可能感兴趣的文章
DB2 行转列
查看>>
DB2 认证路线图
查看>>
一个类似行转列的问题
查看>>
遇到问题该如何解决
查看>>
美国金融体系
查看>>
DB CHNGPGS_THRES 参数
查看>>
DB2 特殊寄存器(Special Registers)
查看>>
在ORDER BY 子句中加入主键或唯一键
查看>>
DB2 UPDATE 语句
查看>>
SQL PL 精萃
查看>>
GROUPING SETS、ROLLUP、CUBE
查看>>
数据类型和变量
查看>>
表连接(JOIN)
查看>>
游标(Cursor)
查看>>
复合语句(compound statement)
查看>>
DB2 物化查询表
查看>>
IF 语句
查看>>
循环语句
查看>>
DB2 临时表
查看>>
ITERATE、LEAVE、GOTO和RETURN
查看>>