我要实现一个类
来随机生成随机数密码
要求generateInt(int length)方法返回长度为length的数字密码
generateString(int length)返回的是长度为length的数字和字母的组合密码。这两个方法都要遵守以下规则:连续相邻的字母和数字中最多有两个重复的,如11aabb。
长度为length的密码中不同数字的个数要大于等于length/2。
应该如何实现呢,希望有达人给点意见!

解决方案 »

  1.   

    /**
     * Description:密码产生器,产生两种格式的密码,一种是数字密码;一种是数字字母混合密码 相邻位重复不得超过两位
    相同数字和字母的个数不能超过总长度的1/2package com.cvicse.training;import javax.swing.*;public class GeneratePassword { int random = 0; String password; char[] ch; boolean flage, flagn; static int length; // 产生数字密码

     String GenerateInt(int length) {
    this.length = length;
    int number = 0;
    // 生成一个随机数 长度为length
    while (number < (Math.pow(10, length - 1))) {
    number = (int) (Math.random() * (Math.pow(10, length)));
    }
    password = String.valueOf(number);
    ch = password.toCharArray();
    judgequals();
    judgecount();
    // 判断是否符合格式要求 符合则返回密码 不符合则重新生成
    if (flage && flagn)
    return password;
    else
    return GenerateInt(length);
    } // 判断random对应的ASCII码是否为数字和字母 数字为48-57 大写字母为65-90 小写字母为97-122
    boolean flag() {
    if (random > 47 && random < 58)
    return true;
    else if (random > 64 && random < 91)
    return true;
    else if ((random > 96 && random < 123))
    return true;
    else
    return false;
    } // 判断相邻位重复的个数是否大于二
    boolean judgequals() { // System.out.println("asdf0");
    for (int i = 0; i < length - 2; i++) {
    if (ch[i] == ch[i + 1] && ch[i] == ch[i + 2]) {
    flage = false;
    break;
    } else
    flage = true;
    }
    // System.out.println("adsaf0");
    return flage;
    } // 判断相同数字或字母的个数是否大于length/2
    void judgecount() {
    flagn = false;
    for (int k = 0; k < length; k++) {
    int count = 0;
    for (int j = 0; j < ch.length; j++) {
    if (ch[k] == ch[j])
    count++;
    }
    if (count < (length / 2))
    flagn = true;
    else {
    flagn = false;
    break;
    }
    }
    }
    // 产生字母数字混合密码
      String GenerateString(int length) {
    this.length = length;
    ch = new char[length];
    int i = 0;
    // 生成122以内的数字 以对应正确的ASCII码
    while (!flag()) {
    random = (int) (Math.random() * 122 + 1);
    if (flag()) {
    ch[i] = (char) random;
    i++;
    random = 0;
    } else
    continue;
    if (i == length)
    break;
    } password = new String(ch); ch = password.toCharArray();
    judgequals();
    judgecount();
    // 判断是否符合格式要求
    if (flagn && flage)
    return password;
    else
    return GenerateString(length); } public static void main(String[] args) { length = Integer.parseInt(JOptionPane.showInputDialog("您要生成密码的位数是:")); // 产生十个9位的数字密码
    GeneratePassword gp = new GeneratePassword();
    for (int m = 0; m < 10; m++) {
    System.out.println(gp.GenerateInt(length));
    }
    System.out.println("-------------------------");
    // 产生十个9位的数字字母混合密码
    for (int m = 0; m < 10; m++) {
    System.out.println(gp.GenerateString(length));
    }
    }}
    这是一个思路.还有一个思路是我同事写的代码/**完成日期 2007.07.12
     * @author MJF
        数字密码思想:
    *1、将所有数字存储在一个数组中intarray
    *2、每次生成一个随机数,将intarray中对应此随机数的字符取出,并从intarray中删除此字符(做标记)
    *3、如果用来存储密码的StringBuffer长度小于密码长度,再重复步骤2
    *这样能减少无谓的判断,高效生成所需要的随机码

    **数字和字母组合密码思想:
    *1、将所有数字和字母存储在2个数组intarray_dc(存数字)和chararray(存字母)中
    *2、每次生成1个随机数,将数组中对应此随机数的字符取出,并从数组中删除此字符(做标记)
    *3、如果用来存储密码的StringBuffer长度小于密码长度,再重复步骤2
    *这样能减少无谓的判断,高效生成所需要的随机码
     */
    import java.util.*;
    class Data
    {
      public  int num;
      private int count;
      private char su;
      public Data(int i,int flag)
      {
         num=i;
         count=flag;
      }
      public Data(char c,int flag)
      {
         su=c;
         count=flag;
      }
      public void Setcou(int flag)
      {
        count=flag;
      }
      public int Getnum()
      {
       return num;
      }
      public char GetChar()
      {
       return su;
      }
      public int Getcount()
      {
       return count;
      }
    };
    public class MyJavaRandom {

    private Data intarray[];
    private Data chararray[];
    private Data intarray_dc[];
    private StringBuffer s1;//保存产生的数字密码
    private StringBuffer s2;
    private StringBuffer s3;//保存产生的数字和字母组合密码

    public MyJavaRandom()
    {
      intarray   =new Data[10];
      intarray_dc=new Data[10];
      chararray=new Data[52];
     
      
      s1=new StringBuffer();
      s2=new StringBuffer();  
      s2.append("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
      
      s3=new StringBuffer();

      for(int i=0;i<52;i++)
      {
       Data temp1=new Data(s2.charAt(i),0);
       chararray[i]=temp1;   
       }
      
      for(int i=0;i<10;i++)
      {
       Data temp=new Data(i,0);
       intarray[i]   =temp;
    Data temp1=new Data(i,0);   
       intarray_dc[i]=temp1;
      }

    }
    /***
     * 产生数字组成的密码
     * @param length 欲产生的密码长度
     * @return  密码字符串(数字)
     */
    public String GeneratePassworrd(int length)
    {


    while(s1.length()<length)
    {
    int t = (int) Math.floor(10 * Math.random()) ;
    int k=s1.length()/10;

    if(intarray[t].Getcount()==k)
    {
    s1.append(intarray[t].Getnum());
    intarray[t].Setcou(k+1);
    }
    }
    return s1.toString();
    }
    /***
     * 产生数字和字母组成的密码
     * @param length  欲产生的密码长度
     * @return 密码字符串(数字和字母组合)
     */
    public String GeneratePassworrd2(int length)
    {

    while(s3.length()<length)
    {
    int t1 = (int) Math.floor(62 * Math.random()) ;

    int k=s3.length()/62;

    if(t1<10&&intarray_dc[t1].Getcount()==k)
    {
    s3.append(intarray_dc[t1].Getnum());
    intarray_dc[t1].Setcou(k+1);
    }

    else if(t1>=10&&chararray[t1-10].Getcount()==k)
    {
    s3.append(chararray[t1-10].GetChar());
    chararray[t1-10].Setcou(k+1);
    }

    }
    return s3.toString();
    }
    public static void main(String[] args)

    MyJavaRandom s=new MyJavaRandom();
    System.out.println(s.GeneratePassworrd(1001));
    System.out.println(s.GeneratePassworrd2(2333));
    }

    }
      

  2.   

    [color=#FF6600]虽然不怎么看懂[/color]