Java 學習系列
  • 目錄
  • 新手初入門,切記熟練
    • 參考書籍
    • 安裝 Java
    • 安裝 Eclipse IDE
    • 首次操作 Eclipse
    • 初學常見錯誤 & 提高可讀性
  • 第一章:認識 JAVA
    • 第一支程式:新建檔案
    • 第一支程式:Hello Java
  • 第二章:簡單 Java 程式解析
    • 變數與輸出
    • 重點整理
  • 第三章:變數與資料型態
  • 認識變數與資料型態
  • 溢位
  • 更多資料型態
  • 資料型態的轉換
  • 第四章:運算子、運算式與敘述
    • 運算子、運算式
    • 程式範例
  • 第五章:選擇性敘述與迴圈
    • 選擇性敘述
    • 迴圈
    • 迴圈的跳離
  • 第六章:陣列
    • 一維陣列
    • 二維與多維陣列
  • 第七章:函數
    • 函數與引數
    • 函數傳遞陣列
    • 函數多載
    • 函數 SWAP
  • 第八章:類別
    • 定義類別
    • 使用類別
    • 類別中的函數成員相互呼叫
    • 類別中使用 this
    • 練習:建立圓形類別
    • 傳遞引數與回傳值
    • 多引數
    • 類別中函數的多載
    • 類別成員中的公有與私有
  • 第九章:建構元
    • 認識 建構元
    • 建構元的多載
    • 建構元間的呼叫 - 透過this
    • 建構元中的公有與私有
  • 第十章:實例變數與函數、類別變數與函數
    • 實例變數 與 實例函數
    • 類別變數
    • 類別函數
  • 第11章:類別的繼承
    • 認識類別的繼承
    • 範例:類別的繼承
    • 類別繼承中的建構元呼叫
    • Protected members
    • Overriding
    • super() 與 this()
    • 設定終止繼承
  • 第12章:抽象類別
    • 認識抽象類別
    • 範例:抽象類別
    • 使用抽象類別型態的變數建立物件
  • 第13章:介面Interface
    • 認識介面
    • 範例:介面
    • 介面中的多重繼承
    • 介面的延伸
  • 第14章:例外 Exception
    • 認識例外
    • 例外處理
    • 範例:例外處理
    • 認識例外類別
    • 例外類別捕捉多個例外
    • 於程式中拋出例外
    • 於指定函數拋出例外
    • 自定義例外類別
  • 第15章:執行緒
    • 認識多執行緒
    • 啟動執行緒
    • 實作 RUNNABLE 介面
    • 執行緒生命週期
    • 凍結執行緒 sleep()
    • 凍結執行緒 join()
    • 執行緒的順序
    • 同步處理 Synchronized
  • 習題範例
    • 產生不重複之亂數
  • 後記
  • 致謝
  • 首頁
Powered by GitBook
On this page
  • 解題步驟
  • 宣告陣列
  • 亂數函式
  • 完整程式碼
  • 後記

Was this helpful?

  1. 習題範例

產生不重複之亂數

本篇記錄解題時遇到的題目:如何產生不重複的1-10的數字

解題步驟

宣告陣列

  • 首先宣告一個陣列空間為10的 num變數

    int[] num = new int[10];
    System.out.print("數字: ");
  • 透過for 迴圈製作1-10的數字

    for(int i = 0; i < num.length; i++)
    {
      num[i] = i + 1;
      System.out.print(num[i]+" ");
    }

亂數函式

  • 宣告一個陣列 arr 空間為5

  • arr陣列用途為放置亂數

    int[] arr = new int[5];
  • 首先使用亂數製作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

n = (int)(Math.random()*(10-i));
arr[i] = num[n];
  • 剛剛是透過亂數產生0-9,現在變成產生0-8;目的是不去取用到num[9]

    for(int j = n; j < num.length - 1; j++)
    {
      num[j] = num[j+1];
    }

繼續剛剛的假設,如果產生出 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 …

    int n;
    for(int i = 0; i < arr.length; i++)
    {
     n = (int)(Math.random()*(10-i));
     arr[i] = num[n];
     for(int j = n; j < num.length - 1; j++)
    {
          num[j] = num[j+1];
    }
    }
    return arr;

完整程式碼

public class Example
{
public static void main(String[] args)
{
    int[] num = new int[10];
    System.out.print("數字: ");

    for(int i = 0; i < num.length; i++)
    {
       num[i] = i + 1;
       System.out.print(num[i]+" ");
    }

    System.out.print("\n隨機不重複產生5個亂數: ");

    int[] Array;

    Array = getRandom(num);

    for(int i = 0; i < 5; i++)

       System.out.print(Array[i] + " ");
}

public static int[] getRandom(int[] num)
{
    int[] arr = new int[5];
    int n;
    for(int i = 0; i < arr.length; i++)
    {
        n = (int)(Math.random()*(10-i));
        arr[i] = num[n];
        for(int j = n; j < num.length - 1; j++)
        {
            num[j] = num[j+1];
        }
    }
    return arr;
}
}

後記

初值

num 1 2 3 4 5 6 7 8 9 10
arr 0 0 0 0 0

random n = 5

num 1 2 3 4 5 7 8 9 10 10
arr 6 0 0 0 0

random n = 5

num 1 2 3 4 5 8 9 10 10 10
arr 6 7 0 0 0

random n = 3

num 1 2 3 5 8 9 10 10 10 10
arr 6 7 4 0 0

10-i 是因為要讓每次取 num 陣列的範圍變小, 以上面結果來說明,可以理解成不要取重複 10 的部分。

num.length – 1 是因為在把 num 往前移動時,如果不減一,j 在最尾端時 num[j+1] 就會超出陣列範圍。

Previous同步處理 SynchronizedNext後記

Last updated 4 years ago

Was this helpful?

本文於 iT邦幫忙曾被提出,在此感謝 fysh711426 替我更近一步的解說,以下為 所示範的程式運行:

討論
fysh711426