如何用隨機數填滿數組
1. 概述
產生隨機數是一項常見的程式設計任務,主要用於模擬、測試和遊戲。在本教程中,我們將介紹使用偽隨機數產生器產生的隨機數來填充數組內容的多種方法。
2. 使用迭代方法
在各種可用的方法中,我們可以使用Random
、 SecureRandom
和ThreadLocalRandom
類別提供的方法迭代地用隨機數填充數組的內容,這適用於不同的場景。這些類別在 Java 中產生偽隨機數,並具有nextInt()
、 nextDouble()
等方法。
讓我們來看看一個如何使用nextInt()
方法填入數組的範例:
int LOWER_BOUND = 1;
int UPPER_BOUND = 100;
int ARRAY_SIZE = 10;
int[] arr = new int[ARRAY_SIZE];
// random number generator
Random random = new Random();
/ iterate and fill
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(LOWER_BOUND, UPPER_BOUND);
}
System.out.println(Arrays.toString(arr));
上面的程式碼隨機產生以下輸出:
[31, 2, 19, 14, 93, 31, 78, 46, 9, 46]
我們定義了一個ARRAY_SIZE
元素數組,並用LOWER_BOUND
和UPPER_BOUND
(不包括)範圍內的隨機數填充它。我們將在後續程式碼範例中保持相同的大小和邊界。
除了提到的類別之外,我們還可以使用Math.random()
靜態方法來實現相同的目標。 Math.random()
傳回 0.0(含)到 1.0(不含)範圍內的偽隨機雙精度數:
int[] arr = new int[ARRAY_SIZE];
// iterate and fill
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (UPPER_BOUND - LOWER_BOUND)) + LOWER_BOUND;
}
System.out.println(Arrays.toString(arr));
讓我們來看看執行程式碼後控制台顯示什麼:
[78, 9, 46, 39, 78, 90, 46, 79, 51, 25]
我們選擇哪種類別和方法完全取決於應用程式的要求。
3. 使用 Java 流
我們可以使用 Java 8 及更高版本中加入到偽隨機數類別的ints()
、 longs()
和doubles()
方法來產生隨機數。 這些方法能夠產生隨機數流,並允許有效地創建隨機整數、長值和雙精度數。
讓我們透過使用ints()
方法的範例來示範上述內容:
// random number generator
Random random = new Random();
// fill with ints method
int[] arr = random.ints(ARRAY_SIZE, LOWER_BOUND, UPPER_BOUND).toArray();
System.out.println(Arrays.toString(arr));
讓我們看看程式碼產生什麼輸出:
[73, 75, 50, 92, 8, 6, 12, 41, 40, 85]
上面顯示了這些方法如何輕鬆地填充數組的內容而不使用循環。
4.使用Arrays.setAll()
方法
用預設值填滿數組內容的另一種方法是使用靜態Arrays.
setAll()
方法,它使用生成器函數來設定指定數組的所有元素。此方法可與隨機數產生器結合使用,乾淨簡潔地用隨機數填滿陣列。此方法可以與任何偽隨機數產生器或我們希望使用的任何其他函數一起使用。
讓我們來看看使用SecureRandom
數字類別的實際效果:
int[] arr = new int[ARRAY_SIZE];
// fill content
Arrays.setAll(arr, r -> new SecureRandom().nextInt(LOWER_BOUND, UPPER_BOUND));
System.out.println(Arrays.toString(arr));
運行上面的程式碼後,我們將得到以下隨機數字:
[5, 30, 88, 28, 20, 86, 6, 74, 31, 80]
5. 使用種子產生隨機數
在某些情況下,我們希望產生相同的隨機數序列或避免每次都產生相同的序列(預設行為)。 Random
和SecureRandom
類別允許在初始化時或稍後設定種子值。相較之下, ThreadLocalRandom
類不支援直接設定種子以提高效能。
讓我們透過一個例子來看看它是如何運作的:
// Produce identical elements repeatedly
int[] arr = new Random(12345).ints(ARRAY_SIZE, LOWER_BOUND, UPPER_BOUND).toArray();
int[] arr2 = new Random(12345).ints(ARRAY_SIZE, LOWER_BOUND, UPPER_BOUND).toArray();
System.out.printf("Arr: %s%n", Arrays.toString(arr));
System.out.printf("Arr2: %s%n", Arrays.toString(arr2));
// using different seeds
int[] arr3 = new Random(54321).ints(ARRAY_SIZE, LOWER_BOUND, UPPER_BOUND).toArray();
System.out.printf("%nArr2: %s%n", Arrays.toString(arr2));
System.out.printf("Arr3: %s%n", Arrays.toString(arr3));
讓我們看看上面的範例執行後會產生什麼結果:
`Arr: [95, 95, 7, 55, 68, 77, 8, 73, 26, 88]
Arr2: [95, 95, 7, 55, 68, 77, 8, 73, 26, 88]
Arr2: [95, 95, 7, 55, 68, 77, 8, 73, 26, 88]
Arr3: [22, 20, 39, 49, 86, 3, 83, 46, 98, 88]`
從上面的範例可以清楚地看出,為arr
和arr2
設定相同的種子值可讓我們重新產生相同的數字序列。這演示了播種如何在隨機數生成中提供一致性和可重複性。
如果我們不設定任何種子值或始終設定不同的種子值,我們會得到不同的序列,就像arr2
和arr3
一樣。如果未設定種子值,這是預設行為。
注意:如果未提供種子或提供不同的種子值,由於隨機性,您可能會得到與本文中顯示的結果不同的結果。
六、結論
在本文中,我們探索了使用 Java 中的隨機數產生器以隨機數填充數組的各種方法。每個偽隨機數產生器類別都有其優點和缺點。
了解種子的重要性可以幫助您在需要時產生可重複的序列,這對於偵錯、模擬和測試非常有價值,並且可以成為隨機數產生工具包的另一層實用工具。
完整的程式碼範例可以在 GitHub 上找到。