第二章:簡單 Java 程式解析
第三章:變數與資料型態
第四章:運算子、運算式與敘述
第五章:選擇性敘述與迴圈
第十章:實例變數與函數、類別變數與函數
Powered By GitBook
產生不重複之亂數
本篇記錄解題時遇到的題目:如何產生不重複的1-10的數字

解題步驟

宣告陣列

    首先宣告一個陣列空間為10的 num變數
    1
    int[] num = new int[10];
    2
    System.out.print("數字: ");
    Copied!
    透過for 迴圈製作1-10的數字
    1
    for(int i = 0; i < num.length; i++)
    2
    {
    3
    num[i] = i + 1;
    4
    System.out.print(num[i]+" ");
    5
    }
    Copied!

亂數函式

    宣告一個陣列 arr 空間為5
    arr陣列用途為放置亂數
    1
    int[] arr = new int[5];
    Copied!
    首先使用亂數製作0-9的數字n,並放入num陣列
    假設亂數產生出 n=2 ,那麼 num[2] = 3 以此類推:num[0]=1, num[1]=2, num[2]=3, …, num[9]=10
    再將 num[2] 放入 arr[0]
num
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
1
2
3
4
5
6
7
8
9
10
arr
[0]
[1]
[2]
[3]
[4]
3
0
0
0
0
陣列不會因為取代了前方的值,本值就消失 所以最後方[9]=10
1
n = (int)(Math.random()*(10-i));
2
arr[i] = num[n];
Copied!
    剛剛是透過亂數產生0-9,現在變成產生0-8;目的是不去取用到num[9]
    1
    for(int j = n; j < num.length - 1; j++)
    2
    {
    3
    num[j] = num[j+1];
    4
    }
    Copied!
繼續剛剛的假設,如果產生出 n = 8 那麼 num[ 8 ]=10 再把 num[ 8 ]=10 放到 arr[1] (此為第二個亂數)。
num
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
1
2
4
5
6
7
8
9
10
10
arr
[0]
[1]
[2]
[3]
[4]
3
10
0
0
0
    以此類推,再產生0-7、0-6、0-5 …
    1
    int n;
    2
    for(int i = 0; i < arr.length; i++)
    3
    {
    4
    n = (int)(Math.random()*(10-i));
    5
    arr[i] = num[n];
    6
    for(int j = n; j < num.length - 1; j++)
    7
    {
    8
    num[j] = num[j+1];
    9
    }
    10
    }
    11
    return arr;
    Copied!

完整程式碼

1
public class Example
2
{
3
public static void main(String[] args)
4
{
5
int[] num = new int[10];
6
System.out.print("數字: ");
7
8
for(int i = 0; i < num.length; i++)
9
{
10
num[i] = i + 1;
11
System.out.print(num[i]+" ");
12
}
13
14
System.out.print("\n隨機不重複產生5個亂數: ");
15
16
int[] Array;
17
18
Array = getRandom(num);
19
20
for(int i = 0; i < 5; i++)
21
22
System.out.print(Array[i] + " ");
23
}
24
25
public static int[] getRandom(int[] num)
26
{
27
int[] arr = new int[5];
28
int n;
29
for(int i = 0; i < arr.length; i++)
30
{
31
n = (int)(Math.random()*(10-i));
32
arr[i] = num[n];
33
for(int j = n; j < num.length - 1; j++)
34
{
35
num[j] = num[j+1];
36
}
37
}
38
return arr;
39
}
40
}
Copied!

後記

本文於 iT邦幫忙曾被提出討論,在此感謝 fysh711426 替我更近一步的解說,以下為 fysh711426 所示範的程式運行:
初值
1
num 1 2 3 4 5 6 7 8 9 10
2
arr 0 0 0 0 0
Copied!
random n = 5
1
num 1 2 3 4 5 7 8 9 10 10
2
arr 6 0 0 0 0
Copied!
random n = 5
1
num 1 2 3 4 5 8 9 10 10 10
2
arr 6 7 0 0 0
Copied!
random n = 3
1
num 1 2 3 5 8 9 10 10 10 10
2
arr 6 7 4 0 0
Copied!
10-i 是因為要讓每次取 num 陣列的範圍變小, 以上面結果來說明,可以理解成不要取重複 10 的部分。
num.length – 1 是因為在把 num 往前移動時,如果不減一,j 在最尾端時 num[j+1] 就會超出陣列範圍。
Last modified 9mo ago