1. 程式人生 > 其它 >雜文之生成隨機字串

雜文之生成隨機字串

技術標籤:知識雜文感想java程式語言

文章目錄


不使用工具類

生成隨機字串,自己以前總是模模糊糊記得點,也沒有認真的去搞過,有時候又會忘記,所以老老實實寫吧;

1.如何獲取到一個隨機數?

查了百度,看了很多文章,其中有幾篇很好,我參考了,連結如下:
生成隨機數文章1

生成隨機數文章2

其有一點很重要,java中的隨機數也確實是偽隨機數。。。。。

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

一共是生成包括09之內的數字

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();
    }

使用工具

這個,先欠著。。。未完待續;