如何在 Java 中创建一个随机安全码数组?
How to create an array of random security codes in Java?
我正在尝试编写一个程序,询问用户他想要生成多少安全代码,然后它会在数组中输出他请求的代码数量。
安全码长度应为7个字符,格式如下:NNNNLLL,其中N为随机数,L为随机大写字母。
该方法应通过随机选择字符(即数字和字母)创建具有上述格式的安全代码。
如果用户选择生成 4 个代码,我希望程序输出类似这样的内容:
“2394QAB”
“2821TSZ”
“7173AAY”
“2236WQA”
我只能使用我在课程中学到的代码方法,不能使用其他库,如 regex,这就是为什么我要这样尝试。
这是我到目前为止完成的代码:
import java.util.Random;
public class ItemChecker{
private StringBuffer strBuff;
private String[] codes;
private String CodeLetters, CodeNumbers;
private int[] RandomNums;
public ItemChecker(){
strBuff=new StringBuffer();
}
public String[] getCodes(int[] amount){
codes=new String[amount.length];
for(int i=0;i<amount.length;i++)
{
CodeLetters="";
strBuff=new StringBuffer();
for(int j=0;j<4;j++)
{
Random RandomNumber=new Random();
int randomIndex=RandomNumber.nextInt(RandomNums.length);
CodeNumbers.append(RandomNumber[randomIndex]);
}
for(int j=0;j<3;j++)
{
Random RandomLetter=new Random();
char c =(char)(RandomLetter.nextInt(26)+'a');
CodeLetters+=c;
}
codes[i]=CodeNumbers+CodeLetters;
}
}
}
我的意图是创建 4 个随机数字和 3 个随机字母,并将它们加在一起形成一个字符串来生成代码。但是,代码不会生成随机代码,我不知道如何从这里开始。
您的 getCodes
方法中有几个错误。 StringBuiler
更适合此任务,而不是使用 StringBuffer
或使用 +
运算符链接字符串。事实上,每次使用 +
运算符执行连接时,您都是在内存中创建一个新字符串,而不是在同一个实例上工作,这样效率不高。此外,当您向表示大写字母的随机值添加偏移量时,您添加的是小写字母 'a',而不是大写字母 'A'.
在您的程序中,您可以定义一个静态方法来提供代码生成服务作为通用实用程序,然后在您的 getCodes
方法中调用它。
在实用程序方法中,您可以声明一个 Random
对象来获取随机 int 值。然后,通过第一个 for
循环,您可以生成介于 0 和 10 之间的随机值,并将它们附加到 StringBuilder
对象。 String
class 表示 不可变的 对象,因此您需要使用 StringBuilder
来构建一个。如上所述,使用 +
运算符链接字符串将在每次串联时创建新实例,您不是在同一个对象上工作。
然后,通过第二个 for
循环,您可以生成从 0 到 27 的随机值(排除),将偏移量 65 添加到每个值,代表大写 'A' 字母(小写 'a' 的值为 97),然后将此 int
值转换为 char
以获得其字符表示。最后,将 char
附加到您的 StringBuilder
实例。
这是一个实现:
public class Main {
public static void main(String[] args) {
System.out.println(getSecurityCode());
}
public String[] getCodes(int[] amount) {
String[] codes = new String[amount.length];
for (int i = 0; i < codes.length; i++) {
codes[i] = getSecurityCode();
}
return codes;
}
public static String getSecurityCode() {
Random rand = new Random();
StringBuilder strBuilder = new StringBuilder();
//Appending 4 random digits
for (int i = 0; i < 4; i++) {
//nextInt(10) returns a value between 0 (included) and 10 (excluded)
strBuilder.append(rand.nextInt(10));
}
//Appending 3 random upper case letters
for (int i = 0; i < 3; i++) {
//rand.nextInt(27) returns a random value between 0 and 26 included to represent an alphabet letter.
//This value is added with the offset 65 which represents the upper case A letter.
//Finally, this value is cast as a char or else it would append its int value
strBuilder.append((char)(65 + rand.nextInt(27)));
}
return strBuilder.toString();
}
}
为了简化生成密码的代码,您可以使用 org.apache.commons.lang3.RandomStringUtils 中的 RandomStringUtils,就像这个很棒的教程 https://www.baeldung.com/java-random-string 中描述的那样。
您只需要生成 2 个字符串:
一个有4个数字
一个有 3 个字母大写
并将两者连接起来。
方法如下
public static String getSecurityCode() {
//generate 4 numbers only
String generatedNumbers = RandomStringUtils.random(4, false, true);
//generate 3 letters only
String generatedLetters = RandomStringUtils.random(3, true, false).toUpperCase();
return generatedNumbers + generatedLetters;
}
或使用 StringBuilder
public static String getSecurityCode2() {
StringBuilder stb=new StringBuilder(7);
//generate 4 numbers only
stb.append(RandomStringUtils.random(4, false, true));
//generate 3 letters only
stb.append( RandomStringUtils.random(3, true, false).toUpperCase());
return stb.toString();
}
另一种方法是为此使用 StringBuilder 的 appendCodePoint
方法:
int number= random.nextInt(10000); //generate any number between 0 to 9999
StringBuilder builder=new StringBuilder();
for(int i=0;i<3;i++) {
builder.appendCodePoint(65+random.nextInt(26));
}
String result=number+builder.toString();
System.out.println(result);
我正在尝试编写一个程序,询问用户他想要生成多少安全代码,然后它会在数组中输出他请求的代码数量。
安全码长度应为7个字符,格式如下:NNNNLLL,其中N为随机数,L为随机大写字母。
该方法应通过随机选择字符(即数字和字母)创建具有上述格式的安全代码。
如果用户选择生成 4 个代码,我希望程序输出类似这样的内容:
“2394QAB” “2821TSZ” “7173AAY” “2236WQA”
我只能使用我在课程中学到的代码方法,不能使用其他库,如 regex,这就是为什么我要这样尝试。
这是我到目前为止完成的代码:
import java.util.Random;
public class ItemChecker{
private StringBuffer strBuff;
private String[] codes;
private String CodeLetters, CodeNumbers;
private int[] RandomNums;
public ItemChecker(){
strBuff=new StringBuffer();
}
public String[] getCodes(int[] amount){
codes=new String[amount.length];
for(int i=0;i<amount.length;i++)
{
CodeLetters="";
strBuff=new StringBuffer();
for(int j=0;j<4;j++)
{
Random RandomNumber=new Random();
int randomIndex=RandomNumber.nextInt(RandomNums.length);
CodeNumbers.append(RandomNumber[randomIndex]);
}
for(int j=0;j<3;j++)
{
Random RandomLetter=new Random();
char c =(char)(RandomLetter.nextInt(26)+'a');
CodeLetters+=c;
}
codes[i]=CodeNumbers+CodeLetters;
}
}
}
我的意图是创建 4 个随机数字和 3 个随机字母,并将它们加在一起形成一个字符串来生成代码。但是,代码不会生成随机代码,我不知道如何从这里开始。
您的 getCodes
方法中有几个错误。 StringBuiler
更适合此任务,而不是使用 StringBuffer
或使用 +
运算符链接字符串。事实上,每次使用 +
运算符执行连接时,您都是在内存中创建一个新字符串,而不是在同一个实例上工作,这样效率不高。此外,当您向表示大写字母的随机值添加偏移量时,您添加的是小写字母 'a',而不是大写字母 'A'.
在您的程序中,您可以定义一个静态方法来提供代码生成服务作为通用实用程序,然后在您的 getCodes
方法中调用它。
在实用程序方法中,您可以声明一个 Random
对象来获取随机 int 值。然后,通过第一个 for
循环,您可以生成介于 0 和 10 之间的随机值,并将它们附加到 StringBuilder
对象。 String
class 表示 不可变的 对象,因此您需要使用 StringBuilder
来构建一个。如上所述,使用 +
运算符链接字符串将在每次串联时创建新实例,您不是在同一个对象上工作。
然后,通过第二个 for
循环,您可以生成从 0 到 27 的随机值(排除),将偏移量 65 添加到每个值,代表大写 'A' 字母(小写 'a' 的值为 97),然后将此 int
值转换为 char
以获得其字符表示。最后,将 char
附加到您的 StringBuilder
实例。
这是一个实现:
public class Main {
public static void main(String[] args) {
System.out.println(getSecurityCode());
}
public String[] getCodes(int[] amount) {
String[] codes = new String[amount.length];
for (int i = 0; i < codes.length; i++) {
codes[i] = getSecurityCode();
}
return codes;
}
public static String getSecurityCode() {
Random rand = new Random();
StringBuilder strBuilder = new StringBuilder();
//Appending 4 random digits
for (int i = 0; i < 4; i++) {
//nextInt(10) returns a value between 0 (included) and 10 (excluded)
strBuilder.append(rand.nextInt(10));
}
//Appending 3 random upper case letters
for (int i = 0; i < 3; i++) {
//rand.nextInt(27) returns a random value between 0 and 26 included to represent an alphabet letter.
//This value is added with the offset 65 which represents the upper case A letter.
//Finally, this value is cast as a char or else it would append its int value
strBuilder.append((char)(65 + rand.nextInt(27)));
}
return strBuilder.toString();
}
}
为了简化生成密码的代码,您可以使用 org.apache.commons.lang3.RandomStringUtils 中的 RandomStringUtils,就像这个很棒的教程 https://www.baeldung.com/java-random-string 中描述的那样。 您只需要生成 2 个字符串: 一个有4个数字 一个有 3 个字母大写
并将两者连接起来。
方法如下
public static String getSecurityCode() {
//generate 4 numbers only
String generatedNumbers = RandomStringUtils.random(4, false, true);
//generate 3 letters only
String generatedLetters = RandomStringUtils.random(3, true, false).toUpperCase();
return generatedNumbers + generatedLetters;
}
或使用 StringBuilder
public static String getSecurityCode2() {
StringBuilder stb=new StringBuilder(7);
//generate 4 numbers only
stb.append(RandomStringUtils.random(4, false, true));
//generate 3 letters only
stb.append( RandomStringUtils.random(3, true, false).toUpperCase());
return stb.toString();
}
另一种方法是为此使用 StringBuilder 的 appendCodePoint
方法:
int number= random.nextInt(10000); //generate any number between 0 to 9999
StringBuilder builder=new StringBuilder();
for(int i=0;i<3;i++) {
builder.appendCodePoint(65+random.nextInt(26));
}
String result=number+builder.toString();
System.out.println(result);