雜文之生成隨機字串
文章目錄
不使用工具類
生成隨機字串,自己以前總是模模糊糊記得點,也沒有認真的去搞過,有時候又會忘記,所以老老實實寫吧;1.如何獲取到一個隨機數?
查了百度,看了很多文章,其中有幾篇很好,我參考了,連結如下:
生成隨機數文章1
a.常規生成隨機數Math.random():
Math.random(),其範圍是[0.0,1.0),
左閉右開:
以下是引用文章2內容:
呼叫這個Math.Random()函式能夠返回帶正號的double值,
取值範圍是[0.0,1.0),在該範圍內(近似)均勻分佈。
因為返回值是double型別的,小數點後面可以保留15位小數,所以產生相同的可能性非常小,在這一定程度上是隨機數。
其包是:
java.lang.Math.Random:
舉例:
生成一個0-9之間的隨機數:
Math.random()*10
一共是生成包括0到9之內的數字
b.常規生成隨機數new Random():
有兩種構造方式,如下也引用文章2:
下面Random()的兩種構造方法:
Random():使用一個和當前系統時間對應的相對時間有關的數字作為種子數。
Random(long seed):直接傳入一個種子數。
種子的作用是什麼?
種子就是產生隨機數的第一次使用值,機制是通過一個函式,將這個種子的值轉化為隨機數空間中的某一個點上,並且產生的隨機數均勻的散佈在空間中。以後產生的隨機數都與前一個隨機數有關
其包是:
java.util.Random:
舉例:生成0-9之間的隨機數
//1.指定種子值
Random r=new Random(100);
int a = random.nextInt(10);//產生[0,9]的隨機數
int b = random.nextInt(10);
//2.不指定種子值
Random r=new Random();
int a = random.nextInt(10);//產生[0,9]的隨機數
/*
區別在於,如果指定了種子數的話,
那麼多次使用這個Random物件獲得的隨機數是一樣的,
也就是說,其a==b
*/
c.使用System.currentTimeMillis()生成隨機數
這個獲得的是自:
1970-1-01 00:00:00.000 到當前時刻的時間距離,型別為long,單位為毫秒;
所以要使用這個來當隨機數的話,一般都要轉換成int;
舉例:生成0-9之間的隨機數
int randomNum = (int)(System.currentTimeMillis()%10);
對於這個System.currentTimeMillis()方法,其使用還可以參考文章:
獲取當前毫秒值的使用
2.如何使用隨機數生成隨機字串?
其方法參考了站長,站長網站如下;
站長網址
分析:
思路在於,讓隨機數出現的數字是一串定義好的字串索引內的數字,然後根據隨機生成的每一個數字索引,得到每一個字串,然後拼接組合成一段隨機字串;
總結就是:
讓隨機生成的數作為字串的索引,從而達到生成隨機字串的作用;
a.因為獲取到的每一個隨機索引的隨機字串要拼接到一起,所以需要一個能夠儲存拼接字串的容器,而這個可以使用如下:
陣列型別,String型別,StringBuffer型別,StringBuilder型別
暫時只曉得這四個。。。。。歡迎大家補充。。
基於效能和執行緒安全考慮,我採用StringBuffer型別;
b.解決了容器,接下來就是定義想要隨機生成的字串有哪些了;
其字串看個人需求;
c.定義字串,可以直接定義,例如:String a=“abcd”;
也可以使用ASCll表中,來定義;
我這採用ASCll表來使用;
對了,不記得某個數字或者英文字母的Ascll碼值,可以轉換成short型別來獲取:
char a='B';
short s= (short) a;
char b='1';
short y= (short) b;
System.out.println("輸出的是多少?"+s);//輸出ASCll66
System.out.println("輸出的是多少?"+y);//輸出ASCLL49
生成隨機字串程式碼
方法一:
public static void main(String[] args) {
System.out.println("這樣可以生成嗎?"+method8(5));
}
/*
生成隨機字串方法一
* */
public static String method7(int n){
// 定義想要隨機出現的字串的容器
StringBuffer sb=new StringBuffer();
// 將字串儲存進容器
for (short i = 'a'; i <'z'; i++) {
sb.append((char)i);
}
for (short i = 'A'; i <'Z'; i++) {
sb.append((char)i);
}
for (short i = '1'; i <'9'; i++) {
sb.append((char)i);
}
// 定義用來儲存隨機生成字串的容器
StringBuffer cunchu=new StringBuffer();
for (int i = 0; i < n; i++) {//其生成字串的長度在於傳遞的數是多少
// 使用隨機數方法生成隨機數,其隨機數是作為定義字串的索引
int index = (int) (Math.random() * sb.length());
// 使用通過索引獲取值方法charAt
cunchu.append(sb.charAt(index));
}
return cunchu.toString();
}
方法二:
第二個方式的思路是利用了,其short型別的數字可以直接代表了ascll碼中符號,所以隨機生成其ascll碼的數字大小,就可以獲取符號,然後再拼接,這樣也可以獲取隨機字串;
程式碼如下:
public static void main(String[] args) {
System.out.println("這樣可以生成嗎?"+method8(5));1
}
public static String method8(int n){
// 定義用來儲存隨機生成字串的容器
StringBuffer cunchu=new StringBuffer();
// 定義隨機要生成的字串
// 在Ascll碼中,0到z之間包含了大小寫和數字,但是還包含了其它符號
short start='0';
// 這裡加1是因為其Math.Random是一個左閉右開的集合,要包括小寫z
short end='z'+1;
// 在指定的生成幾位數的迴圈中
for (int i = 0; i < n; i++) {
/*
* 這個while(true)迴圈必須要有
* 假設外迴圈為5次
* 那麼假設我五次都沒有找到一個數字或者字母,那。。
* 容器裡面豈不是為null。。。。因而言必須要有內迴圈
* */
while(true){
// 獲取ascll碼中48到122中代表的字元,即0到z
char result= (char) (Math.random()*((end-start)+start));
// 判斷是否為字母或者為數字,如果是就拼接到容器中
if(Character.isLetter(result)||Character.isDigit(result)){
cunchu.append(result);
break;
}
}
}
return cunchu.toString();
}
使用工具
這個,先欠著。。。未完待續;