Java實現隨機抽獎的方法有哪些

TechSynapse發表於2024-09-28

在Java中實現隨機抽獎的方法,通常我們會使用java.util.Random類來生成隨機數,然後基於這些隨機數來選擇中獎者。以下將給出幾種常見的隨機抽獎實現方式,包括從陣列中抽取、從列表中抽取以及基於權重的抽獎方式。

1. 從陣列中抽取

import java.util.Random;  
  
public class LotteryFromArray {  
    public static void main(String[] args) {  
        String[] candidates = {"Alice", "Bob", "Charlie", "David", "Eva"};  
        Random random = new Random();  
          
        // 生成一個0到candidates.length-1之間的隨機數  
        int index = random.nextInt(candidates.length);  
          
        // 輸出中獎者  
        System.out.println("中獎者是:" + candidates[index]);  
    }  
}

2. 從列表中抽取

使用ArrayListLinkedList等集合類也可以實現抽獎,特別是在需要動態新增或刪除候選人時。

import java.util.ArrayList;  
import java.util.List;  
import java.util.Random;  
  
public class LotteryFromList {  
    public static void main(String[] args) {  
        List<String> candidates = new ArrayList<>();  
        candidates.add("Alice");  
        candidates.add("Bob");  
        candidates.add("Charlie");  
        candidates.add("David");  
        candidates.add("Eva");  
          
        Random random = new Random();  
          
        // 生成一個0到candidates.size()-1之間的隨機數  
        int index = random.nextInt(candidates.size());  
          
        // 輸出中獎者  
        System.out.println("中獎者是:" + candidates.get(index));  
    }  
}

3. 基於權重的抽獎

在一些情況下,每個候選人的中獎機率可能不同,這就需要實現基於權重的抽獎。

import java.util.ArrayList;  
import java.util.List;  
import java.util.Random;  
  
public class LotteryWithWeights {  
  
    static class Candidate {  
        String name;  
        int weight; // 權重  
  
        public Candidate(String name, int weight) {  
            this.name = name;  
            this.weight = weight;  
        }  
    }  
  
    public static void main(String[] args) {  
        List<Candidate> candidates = new ArrayList<>();  
        candidates.add(new Candidate("Alice", 1));  
        candidates.add(new Candidate("Bob", 3));  
        candidates.add(new Candidate("Charlie", 1));  
        candidates.add(new Candidate("David", 2));  
        candidates.add(new Candidate("Eva", 3));  
  
        Random random = new Random();  
        int totalWeight = 0;  
        for (Candidate candidate : candidates) {  
            totalWeight += candidate.weight;  
        }  
  
        int target = random.nextInt(totalWeight) + 1;  
        int sum = 0;  
        for (Candidate candidate : candidates) {  
            sum += candidate.weight;  
            if (sum >= target) {  
                System.out.println("中獎者是:" + candidate.name);  
                break;  
            }  
        }  
    }  
}

在上述基於權重的抽獎示例中,我們定義了一個Candidate類來儲存候選人的姓名和權重。然後,透過累加權重並生成一個隨機數來決定中獎者。注意,這裡我們透過random.nextInt(totalWeight) + 1來確保生成的隨機數是從1到總權重(包含)之間的,從而避免0值導致的問題。最後,透過遍歷候選人列表並累加權重,找到大於或等於隨機數的第一個候選人作為中獎者。

以上三種方法分別適用於不同的場景,可以根據實際需求選擇使用。

相關文章