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