杂文之生成随机字符串


不使用工具类

生成随机字符串,自己以前总是模模糊糊记得点,也没有认真的去搞过,有时候又会忘记,所以老老实实写吧;

1.如何获取到一个随机数?

查了百度,看了很多文章,其中有几篇很好,我参考了,链接如下:
生成随机数文章1

生成随机数文章2

其有一点很重要,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

一共是生成包括09之内的数字

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

使用工具

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值