Java中生成亂數
人機互動程序中,當我們需要機器給我們反饋不確定的數字結果時,就會需要用到亂數了,那么,在Java中,我們應當如何來生成并使用亂數呢?
一、通過Random類來實作
Random類是JDK的java.util包中的一個工具類,該類可用于在指定范圍內產生亂數字,考察一下Random類的兩種構造方法:無參構造和有參構造
- Random(); 無參構造方法創建一個偽亂數生成器,
- Random(long seed);有參構造方法使用一個long型的種子創建偽亂數生成器,
下面分別使用兩種方式創建Random物件來獲取10個0到100的亂數
無參構造方式
public class demo1 {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(random.nextInt(100));
}
}
運行結果:

這里總結一個應用random.nextInt()的式子:random.nextInt(n)+m,回傳的是m到m+n-1之間的亂數,比如random.nextInt(9)+1,得到就是1到10之間的某數,如果沒有n和m,那么就是生成一個隨機的int型別的值,當然除了int型別,也可以生成其他數字型的基本資料型別的亂數,比如double、float、byte等等,
- nextDouble()方法回傳的是0.0到1.0之間的一個double型別的值
- nextFloat()方法回傳的是0.0到1.0之間的一個float型別的值
有參構造方式
public class demo1 {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(random.nextInt(100));
}
Random random1 = new Random(100);
System.out.println("---------");
for(int i = 0 ;i<10;i++){
System.out.println(random1.nextInt(100));
}
}
這里為了方便跟無參構造方法創建的亂數生成器作比較,創建了兩個Random物件,
運行結果:

再執行一次代碼的結果:

怎么樣?是不是發現下面的有參構造生成的亂數每次運行結果都是一樣的,而無參構造方法的random物件每次都能得到不同的亂數,
這里的原因是:無參構造方法在創建Random物件時沒有傳入種子引數,程式會自動以當前時間為時間戳,于是每一次的運行結果都是不同的,而有參構造方法創建Random物件時傳入了種子引數,兩次運行時種子相同,實際上不管運行多少次,結果都是一樣的,
二、使用Math類的random方法
Java中的Math類也提供了一個生成亂數的random方法,
首先需要明確,Math.random()是隨機生成一個0.0到1.0之間的double型別的亂數,這里包含0而不包含1,
常見的用法:
public class demo1 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println((int) (Math.random() * 10));
}
}
Math.random()生成0到1之間的double數,乘以10就變成了0到10之間的double數,再轉成int型,這是我平時接觸比較多的用法(通常我們使用亂數也是int型別的居多),運行結果如下(3個0到10之間的整數):

根據需要可以靈活使用random()方法:
- (int)(Math.random()*n)生成大于等于0小于n的亂數,
- (int)(Math.randon()*n)+m生成大于等于m小于m+n的之間的亂數,
- (int)(Math.random()*(n-m)+m)生成從m到n范圍內的數,包含m不包含n,
另外,我們還可以用這種方式生成字符:
- 隨機生成a~z之間的字符
(char)(‘a’+Math.random()*(‘z’-‘a’+1)); - 隨機生成cha1~cha2的字符
(char)(cha1+Math.random()*(cha2-cha1+1));
小結
以上就是近期自己總結的兩種Java中生成亂數的方法,實際上打開Math類中的random方法的原始碼我們可以發現,這個方法就是直接呼叫Random類中的nextDouble方法來實作的,至于實際使用看個人愛好吧,比較推薦直接使用Math類的random方法,要記住的是,以上兩種方法生成的亂數都是會重復的,如果有不能重復的需求,則需要添加其他操作了,
PS:第一次寫博客,有問題的地方歡迎大家指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/169189.html
標籤:其他
