A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢辉林 中级黑马   /  2013-3-11 15:03  /  3259 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//密码的自动生成器:密码由大写字母/小写字母/数字组成,生成六位随机密码;
import java.util.Random;
  
public class TestPassword {
  
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
               char[] pardStore=new char[62];
                 //把所有的大写字母放进去
                   for(int i=0;i<20;i++){
                       pardStore[i]=(char)('A'+i);
                   }
                 //把所有的小写字母放进去
                   for(int i=26;i<52;i++){
                       pardStore[i]=(char)('a'+i);
                   }
                     
                   //吧0到9放进去
                   for(int i=52;i<62;i++){
                       pardStore[i]=(char)('0'+(i-52));
                   }
                     
                   //生成6位随机密码
                   Random r=new Random();
                   for(int i=0;i<6;i++){
                       int n=r.nextInt(62);
                       System.out.print(pardStore[n]);
                   }
               }
    }
请问还有更好实现的方法吗?

点评

请在论坛申请改名通道申请实名改名http://bbs.itheima.com/thread-31067-1-1.html  发表于 2013-3-11 15:19

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

3 个回复

倒序浏览
1、先说想法,大家评判一下
2、分析
        你的这个方法是把 数字、大写字母、小写字母 保存在一个中间数组中,随机生成角标,打印对应的信息。
        这样有一个存入数据的过程,而我们都知道,数字、大写字母、小写字母都有对应ascii值,
        这些信息是已经存在的值,我们完全可以利用,直接随机生成对应的值        
3、思路
        ascii码表中对应的信息,如下所示:
                数字                0~9         对应的ascii值是                        (48~57)
                大写字母        A~Z         对应的ascii值是                        (65~90)
                小写字母        a~z                对应的ascii值是                        (97~122)
        根据以上信息,我们发现
        ascii的值是在 48~122之间但是不包含(58~64和91~96)这13个数。
        也可这样说,ascii的值是在  ( 0~74之间但是不包含(10~16和43~48,这13个数 )+48 。
        所以,ascii的区间也就是  Random().nextint(74)+48 (不包含10~16和43~48)
        
        设计一个类,专门生成符合要求的随机数(这个类还有进行编译,之后是一个设计思想)
        class SuiJiShu
        {        
                random r= new random();
                int rInt=r.nextint(74)+48 ;
                if (rint>=10 || rint<=16  ) or   (rint>=43 || rint<=48 )
                        SUIJISHU;
                ELSE
                        RETURN RINT+48;
        }
        
        这样就有了一个随机出来的ascii,我们把它转换成字符,打印出来就好了,
        需要长度多少就打印多少次!

欢迎各位指正,代码随后,贴出来!

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 江华 于 2013-3-11 16:46 编辑

这是我写的代码:
/*
* ascii中
* 数字是从48~57,A~Z是从65~90 ,a~z是97~122,
* 从48~开始到122之间没有    (58~64)和(91~96)这12个数字
* 我们可以生产随机数,出现没有的12个数字,那就重新再生成!
* 把它们变成48+ new  Random().nextInt(74) 其中  new  Random().nextInt(74)不在(58~64)和(91~96)这12个数字之内
* */
import java.util.Random;
class MiMaShengCheng
{   
    public static void main(String[] args)
    {
        System.out.println("看下我们随机生成的密码是什么?");
        for (int i=0;i<6;i++)
        System.out.print(suiJiShu());        
    }
   
    public static char suiJiShu()
    {
           //生成随机数
        Random r=new Random();
        int rint=r.nextInt(74);
        if((rint > 9 && rint < 17 ) ||  ( rint > 42 && rint < 49))
//            不符号要求,递归调用,找到合适的结束
            return suiJiShu();
        else
//            符合要求,返回生成的ascii对应的字符
            return (char)(rint+48);   
    }
}
回复 使用道具 举报
江华 发表于 2013-3-11 16:36
这是我写的代码:
/*
* ascii中

非常感谢  值得学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马