Java 隨機(jī)取字符串的工具類
一、Java隨機(jī)數(shù)的產(chǎn)生方式
在Java中,隨機(jī)數(shù)的概念從廣義上將,有三種。
1、通過System.currentTimeMillis()來獲取一個(gè)當(dāng)前時(shí)間毫秒數(shù)的long型數(shù)字。
2、通過Math.random()返回一個(gè)0到1之間的double值。
3、通過Random類來產(chǎn)生一個(gè)隨機(jī)數(shù),這個(gè)是專業(yè)的Random工具類,功能強(qiáng)大。
二、Random類API說明
1、Java API說明
Random類的實(shí)例用于生成偽隨機(jī)數(shù)流。此類使用 48 位的種子,使用線性同余公式對(duì)其進(jìn)行修改(請(qǐng)參閱 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 節(jié))。
如果用相同的種子創(chuàng)建兩個(gè) Random 實(shí)例,則對(duì)每個(gè)實(shí)例進(jìn)行相同的方法調(diào)用序列,它們將生成并返回相同的數(shù)字序列。為了保證屬性的實(shí)現(xiàn),為類 Random 指定了特定的算法。
很多應(yīng)用程序會(huì)發(fā)現(xiàn) Math 類中的 random 方法更易于使用。
2、方法摘要
Random()
創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器。
Random(long seed)
使用單個(gè) long 種子創(chuàng)建一個(gè)新隨機(jī)數(shù)生成器:
public Random(long seed) { setSeed(seed); } next 方法使用它來保存隨機(jī)數(shù)生成器的狀態(tài)。
protected int next(int bits)
生成下一個(gè)偽隨機(jī)數(shù)。
boolean nextBoolean()
返回下一個(gè)偽隨機(jī)數(shù),它是從此隨機(jī)數(shù)生成器的序列中取出的、均勻分布的 boolean 值。
void nextBytes(byte[] bytes)
生成隨機(jī)字節(jié)并將其置于用戶提供的字節(jié)數(shù)組中。
double nextDouble()
返回下一個(gè)偽隨機(jī)數(shù),它是從此隨機(jī)數(shù)生成器的序列中取出的、在 0.0 和 1.0之間均勻分布的 double 值。
float nextFloat()
返回下一個(gè)偽隨機(jī)數(shù),它是從此隨機(jī)數(shù)生成器的序列中取出的、在 0.0 和 1.0 之間均勻分布的 float 值。
double nextGaussian()
返回下一個(gè)偽隨機(jī)數(shù),它是從此隨機(jī)數(shù)生成器的序列中取出的、呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,標(biāo)準(zhǔn)偏差是 1.0。
int nextInt()
返回下一個(gè)偽隨機(jī)數(shù),它是此隨機(jī)數(shù)生成器的序列中均勻分布的 int 值。
int nextInt(int n)
返回一個(gè)偽隨機(jī)數(shù),它是從此隨機(jī)數(shù)生成器的序列中取出的、在 0(包括)和指定值(不包括)之間均勻分布的 int值。
long nextLong()
返回下一個(gè)偽隨機(jī)數(shù),它是從此隨機(jī)數(shù)生成器的序列中取出的、均勻分布的 long 值。
void setSeed(long seed)
使用單個(gè) long 種子設(shè)置此隨機(jī)數(shù)生成器的種子。
三、Random類使用說明
1、帶種子與不帶種子的區(qū)別
Random類使用的根本是策略分帶種子和不帶種子的Random的實(shí)例。
通俗說,兩者的區(qū)別是:
帶種子的,每次運(yùn)行生成的結(jié)果都是一樣的。
不帶種子的,每次運(yùn)行生成的都是隨機(jī)的,沒有規(guī)律可言。
2、創(chuàng)建不帶種子的Random對(duì)象
Random random = new Random();
3、創(chuàng)建不帶種子的Random對(duì)象
有兩種方法:
1) Random random = new Random(555L);
2) Random random = new Random();
random.setSeed(555L);
四、綜合應(yīng)用
下面通過最近寫的一個(gè)隨機(jī)數(shù)工具類來展示用法:
import java.util.Random;
/**
* 隨機(jī)數(shù)、隨即字符串工具
* User: leizhimin
* Date: 2008-11-19 9:43:09
*/
public class RandomUtils {
public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String numberChar = "0123456789";
/**
* 返回一個(gè)定長(zhǎng)的隨機(jī)字符串(只包含大小寫字母、數(shù)字)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateString(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(allChar.charAt(random.nextInt(allChar.length())));
}
return sb.toString();
}
/**
* 返回一個(gè)定長(zhǎng)的隨機(jī)純字母字符串(只包含大小寫字母)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateMixString(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(allChar.charAt(random.nextInt(letterChar.length())));
}
return sb.toString();
}
/**
* 返回一個(gè)定長(zhǎng)的隨機(jī)純大寫字母字符串(只包含大小寫字母)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateLowerString(int length) {
return generateMixString(length).toLowerCase();
}
/**
* 返回一個(gè)定長(zhǎng)的隨機(jī)純小寫字母字符串(只包含大小寫字母)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateUpperString(int length) {
return generateMixString(length).toUpperCase();
}
/**
* 生成一個(gè)定長(zhǎng)的純0字符串
*
* @param length 字符串長(zhǎng)度
* @return 純0字符串
*/
public static String generateZeroString(int length) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
sb.append('0');
}
return sb.toString();
}
/**
* 根據(jù)數(shù)字生成一個(gè)定長(zhǎng)的字符串,長(zhǎng)度不夠前面補(bǔ)0
*
* @param num 數(shù)字
* @param fixdlenth 字符串長(zhǎng)度
* @return 定長(zhǎng)的字符串
*/
public static String toFixdLengthString(long num, int fixdlenth) {
StringBuffer sb = new StringBuffer();
String strNum = String.valueOf(num);
if (fixdlenth - strNum.length() >= 0) {
sb.append(generateZeroString(fixdlenth - strNum.length()));
} else {
throw new RuntimeException( "將數(shù)字" + num + "轉(zhuǎn)化為長(zhǎng)度為" + fixdlenth + "的字符串發(fā)生異常!");
}
sb.append(strNum);
return sb.toString();
}
/**
* 根據(jù)數(shù)字生成一個(gè)定長(zhǎng)的字符串,長(zhǎng)度不夠前面補(bǔ)0
*
* @param num 數(shù)字
* @param fixdlenth 字符串長(zhǎng)度
* @return 定長(zhǎng)的字符串
*/
public static String toFixdLengthString(int num, int fixdlenth) {
StringBuffer sb = new StringBuffer();
String strNum = String.valueOf(num);
if (fixdlenth - strNum.length() >= 0) {
sb.append(generateZeroString(fixdlenth - strNum.length()));
} else {
throw new RuntimeException( "將數(shù)字" + num + "轉(zhuǎn)化為長(zhǎng)度為" + fixdlenth + "的字符串發(fā)生異常!");
}
sb.append(strNum);
return sb.toString();
}
public static void main(String[] args) {
System.out.println(generateString(15));
System.out.println(generateMixString(15));
System.out.println(generateLowerString(15));
System.out.println(generateUpperString(15));
System.out.println(generateZeroString(15));
System.out.println(toFixdLengthString(123, 15));
System.out.println(toFixdLengthString(123L, 15));
}
}
運(yùn)行結(jié)果:
vWMBPiNbzfGCpHG
23hyraHdJkKPwMv
tigowetbwkm1nde
BPZ1KNEJPHB115N
000000000000000
000000000000123
000000000000123
Process finished with exit code 0
六、總結(jié)
1、隨機(jī)數(shù)很常用,在Java有三種產(chǎn)生方式,以Random隨機(jī)數(shù)的使用最為復(fù)雜。
2、Random類對(duì)象有是否帶種子之分,帶種子的只要種子相同,多次運(yùn)行,生成隨機(jī)數(shù)的結(jié)果總是那樣。
3、帶種子隨機(jī)數(shù)的帶種子的對(duì)象創(chuàng)建方式有兩種,效果一樣。但是帶種子的隨機(jī)數(shù)用處似乎不大。
4、Random的功能涵蓋了Math.random()的功能。
5、可以通過隨機(jī)數(shù)去做實(shí)現(xiàn)隨機(jī)字符串等復(fù)雜的隨機(jī)數(shù)據(jù)。
6、不要研究不重復(fù)的隨機(jī)數(shù),意義不大
補(bǔ)充代碼:
package com.test;
import java.util.Random;
public class RandomUtils {
public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String LETTERCHAR = "abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String NUMBERCHAR = "0123456789";
/**
* 返回一個(gè)定長(zhǎng)的隨機(jī)字符串(只包含大小寫字母、數(shù)字)
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateString(int length)
{
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
}
return sb.toString();
}
/**
* 返回一個(gè)定長(zhǎng)的隨機(jī)純字母字符串(只包含大小寫字母)
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateMixString(int length)
{
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++)
{
sb.append(ALLCHAR.charAt(random.nextInt(LETTERCHAR.length())));
}
return sb.toString();
}
/**
* 返回一個(gè)定長(zhǎng)的隨機(jī)純大寫字母字符串(只包含大小寫字母)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateLowerString(int length) {
return generateMixString(length).toLowerCase();
}
/**
* 返回一個(gè)定長(zhǎng)的隨機(jī)純小寫字母字符串(只包含大小寫字母)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateUpperString(int length) {
return generateMixString(length).toUpperCase();
}
/**
* 生成一個(gè)定長(zhǎng)的純0字符串
*
* @param length 字符串長(zhǎng)度
* @return 純0字符串
*/
public static String generateZeroString(int length) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
sb.append('0');
}
return sb.toString();
}
/**
* 根據(jù)數(shù)字生成一個(gè)定長(zhǎng)的字符串,長(zhǎng)度不夠前面補(bǔ)0
*
* @param num 數(shù)字
* @param fixdlenth 字符串長(zhǎng)度
* @return 定長(zhǎng)的字符串
*/
public static String toFixdLengthString(long num, int fixdlenth) {
StringBuffer sb = new StringBuffer();
String strNum = String.valueOf(num);
if (fixdlenth - strNum.length() >= 0) {
sb.append(generateZeroString(fixdlenth - strNum.length()));
} else {
throw new RuntimeException("將數(shù)字" + num + "轉(zhuǎn)化為長(zhǎng)度為" + fixdlenth + "的字符串發(fā)生異常!");
}
sb.append(strNum);
return sb.toString();
}
/**
* 根據(jù)數(shù)字生成一個(gè)定長(zhǎng)的字符串,長(zhǎng)度不夠前面補(bǔ)0
*
* @param num 數(shù)字
* @param fixdlenth 字符串長(zhǎng)度
* @return 定長(zhǎng)的字符串
*/
public static String toFixdLengthString(int num, int fixdlenth) {
StringBuffer sb = new StringBuffer();
String strNum = String.valueOf(num);
if (fixdlenth - strNum.length() >= 0) {
sb.append(generateZeroString(fixdlenth - strNum.length()));
} else {
throw new RuntimeException("將數(shù)字" + num + "轉(zhuǎn)化為長(zhǎng)度為" + fixdlenth + "的字符串發(fā)生異常!");
}
sb.append(strNum);
return sb.toString();
}
/**
* 每次生成的len位數(shù)都不相同
* @param param
* @return 定長(zhǎng)的數(shù)字
*/
public static int getNotSimple(int[] param,int len)
{
Random rand = new Random();
for (int i = param.length; i > 1; i--)
{
int index = rand.nextInt(i);
int tmp = param[index];
param[index] = param[i - 1];
param[i - 1] = tmp;
}
int result = 0;
for(int i = 0; i < len; i++)
{
result = result * 10 + param[i];
}
return result;
}
public static void main(String[] args) {
System.out.println(generateString(10));
System.out.println(generateMixString(10));
System.out.println(generateLowerString(10));
System.out.println(generateUpperString(10));
System.out.println(generateZeroString(10));
System.out.println(toFixdLengthString(123, 10));
System.out.println(toFixdLengthString(123L, 10));
int[] in = {1,2,3,4,5,6,7};
System.out.println(getNotSimple(in,3));
}
}
- JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法
- JAVA 生成隨機(jī)數(shù)并根據(jù)后臺(tái)概率靈活生成的實(shí)例代碼
- 如何用java生成指定范圍的隨機(jī)數(shù)
- java生成隨機(jī)字符串的兩種方法
- java實(shí)現(xiàn)隨機(jī)生成UUID
- Java 隨機(jī)生成驗(yàn)證碼(支持大小寫字母、數(shù)字、隨機(jī)字體)的實(shí)例
- java生成字母數(shù)字組合的隨機(jī)數(shù)示例 java生成隨機(jī)數(shù)
- Java生成含字母和數(shù)字的6位隨機(jī)字符串
- java隨機(jī)抽取指定范圍內(nèi)不重復(fù)的n個(gè)數(shù)
- java隨機(jī)抽取指定范圍不重復(fù)的數(shù)字
- java實(shí)現(xiàn)的根據(jù)概率隨機(jī)中獎(jiǎng)測(cè)試類
相關(guān)文章
詳解IntelliJ IDEA創(chuàng)建spark項(xiàng)目的兩種方式
這篇文章主要介紹了詳解IntelliJ IDEA創(chuàng)建spark項(xiàng)目的兩種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01JAVA數(shù)字千分位和小數(shù)點(diǎn)的現(xiàn)實(shí)代碼(處理金額問題)
這篇文章主要介紹了JAVA數(shù)字千分位和小數(shù)點(diǎn)的現(xiàn)實(shí)代碼(處理金額問題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10java連接Access數(shù)據(jù)庫(kù)的方法
這篇文章主要為大家詳細(xì)介紹了java連接Access數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05JavaWeb Refresh響應(yīng)頭代碼實(shí)例詳解
這篇文章主要介紹了JavaWeb Refresh響應(yīng)頭代碼實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02spring boot攔截器實(shí)現(xiàn)IP黑名單實(shí)例代碼
本篇文章主要介紹了spring boot攔截器實(shí)現(xiàn)IP黑名單實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04