当前位置: 首页 > article >正文

Java:随机字符生成器

Java程序生成随机字符和数字组合代码

  • 前言
    • 程序概述
    • 代码解析
      • 生成包含大小写A-Z和数字0-9,总长度为5,且不包含字母O的随机字符串
      • 生成包含大小写A-Z和数字0-9,总长度为4或5,且数字不能连续的随机字符串
  • 总结

前言

在这里插入图片描述

在现代的软件工程实践中,生成随机字符串已成为一个重要的需求,特别是在创建唯一标识符或安全密钥时显得尤为关键。

接下来,我们将深入探讨一个简单的Java程序,它的目的是创造一个由随机字母和数字构成的字符串,并采用多种方法来提高其随机性。

程序概述

程序首先构建了一个集合,包含了全部大写与小写的字母。

随后,从这个集合中随机挑选出四个字符,并在其后附加一个随机产生的数字。

为了提升所生成字符串的复杂度及难以预测性,程序会随机地交换字符串中的两个字符位置。

代码解析

首先,初始化一个 ArrayList 并填充所有英文字母(包括大写和小写):

ArrayList<Character> list = new ArrayList<>();
for (int i = 0; i < 26; i++) {
    list.add((char) ('a' + i));
    list.add((char) ('A' + i));
}
System.out.println(list);

接着,定义一个空字符串 result,用于存放最终生成的随机字符串:

String result = "";
Random r = new Random();

在循环中,从列表中随机选择四个字符,并将它们附加到 result 字符串上:

for (int i = 0; i < 4; i++) {
    int randomIndex = r.nextInt(list.size());
    char c = list.get(randomIndex);
    result = result + c;
}

随后,生成一个介于0至9之间的随机数字,并将其追加到 result 字符串末尾:

int number = r.nextInt(10);
result = result + number;

为了进一步提升随机性,程序将对生成的字符串进行字符位置的交换。这里需要注意的是,原代码中存在一处错误,即 char.length 应该被替换为 chars.length

char[] chars = result.toCharArray();
int index = r.nextInt(chars.length); 

char temp = chars[4];
chars[4] = chars[index];
chars[index] = temp;

最后,将修改后的字符数组转换为字符串并返回:

String code = new String(chars);
return code;

下面我们将针对您的两个例子分别编写Java函数,以便生成满足特定条件的随机字符串。

生成包含大小写A-Z和数字0-9,总长度为5,且不包含字母O的随机字符串

首先,我们需要创建一个字符集合,其中包含了所有的大写和小写字母以及数字,但要去除掉字母’O’和’o’。然后我们随机从中选择字符来构建我们的字符串。

import java.util.ArrayList;
import java.util.Random;

public class RandomStringGenerator {

    public static String generateStringWithoutO() {
        // 创建字符集合
        ArrayList<Character> characters = new ArrayList<>();
        for (char ch = 'A'; ch <= 'Z'; ++ch) {
            if (ch != 'O') {
                characters.add(ch);
                characters.add(Character.toLowerCase(ch));
            }
        }
        for (char ch = '0'; ch <= '9'; ++ch) {
            characters.add(ch);
        }

        // 生成随机字符串
        StringBuilder sb = new StringBuilder();
        Random rand = new Random();
        for (int i = 0; i < 5; i++) {
            int index = rand.nextInt(characters.size());
            sb.append(characters.get(index));
        }

        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(generateStringWithoutO());
    }
}

生成包含大小写A-Z和数字0-9,总长度为4或5,且数字不能连续的随机字符串

这个示例稍微复杂一些,因为我们要确保数字不会连续出现。我们可以先生成一个字符串,然后再检查是否有连续的数字,如果有,则重新生成。

import java.util.ArrayList;
import java.util.Random;

public class RandomStringGenerator {

    private static final ArrayList<Character> CHARACTERS = new ArrayList<>();

    static {
        // 初始化字符集合
        for (char ch = 'A'; ch <= 'Z'; ++ch) {
            CHARACTERS.add(ch);
            CHARACTERS.add(Character.toLowerCase(ch));
        }
        for (char ch = '0'; ch <= '9'; ++ch) {
            CHARACTERS.add(ch);
        }
    }

    public static String generateStringNoConsecutiveNumbers() {
        StringBuilder sb = new StringBuilder();
        Random rand = new Random();
        boolean lastWasNumber = false;

        while (sb.length() < 4 || (sb.length() == 4 && rand.nextBoolean())) { // 长度4或5
            int index = rand.nextInt(CHARACTERS.size());
            char nextChar = CHARACTERS.get(index);

            if (Character.isDigit(nextChar)) {
                if (!lastWasNumber) {
                    sb.append(nextChar);
                    lastWasNumber = true;
                }
            } else {
                sb.append(nextChar);
                lastWasNumber = false;
            }
        }

        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(generateStringNoConsecutiveNumbers());
    }
}

在这两个例子中,我们都使用了ArrayList来存储可能的字符,并利用Random类来产生随机数。第一个例子非常直接地从字符集中抽取字符,而第二个例子则增加了一步检查,以确保不会有两个连续的数字出现在生成的字符串中。

总结

上述Java程序演示了如何通过随机选择和字符位置的交换来生成具有一定复杂度的随机字符串。

虽然这个程序相对简单,但它提供了一个基础框架,可以根据具体需求进行扩展或调整。

例如,可以增加更多的字符选项、调整字符串长度或者引入更复杂的随机化机制等。

对于需要生成随机字符串的应用场景来说,这样的实现方式是一个良好的起点。


http://www.kler.cn/a/286852.html

相关文章:

  • Transformer详解:Attention机制原理
  • Swift 中 Codable 和 Hashable 的理解
  • JSqlParser:Java SQL 解析利器
  • Linux搭建FTP详细流程
  • 总结 uniapp 上不适配iphone的:new Date 时间、border线条、渐变
  • 一个软件分发和下载的网站源码,带多套模板
  • 【问题分析】leash影响壁纸显示+SF侧流程变更梳理【Android15】
  • 2024年互联网公司时薪排行榜大曝光!看完我酸了,第一竟是他…
  • 磐石云语音识别引擎
  • aosp13自由窗口项目出现图库app划线不全bug修改-安卓framework实战项目
  • python内置模块datetime.date类详细介绍
  • lambda c++/java/kotlin
  • 解决Selenium已安装,在pycharm导入时报错
  • 运筹说 第124期 | 存储论应用研究的一些问题
  • TCP 之 三次握手 (面经计网篇)
  • 科技与文化的完美碰撞 德施曼玄武•紫禁城K80亮相成都车展
  • 10-python格式化字符串的四种方法(%,format,f-string,string template)
  • 鸿蒙 申请权限
  • spring boot(学习笔记第十九课)
  • 从理论层面设计简单的电池管理系统(BMS)
  • CAN总线简介
  • LuaJIT源码分析(四)table
  • 【Rust光年纪】探索Rust中的物理引擎库:功能、安装与API概览
  • Django国际化和本地化
  • 【案例】如何做B端竞品分析?
  • SpringBoot Bean初始化顺序