int i = new Random().nextInt(1000); // [0, 999]
if (i < 5) { /* 一等獎 0.5% */ }
else if (i < 10) { /* 二等獎 1% */ }
else if (i < 100) { /* 三等獎 10% */ }
else { /* 未中獎 */ }
概率分佈正確:一等獎 5/1000=0.5%,二等獎 5/1000=0.5%(原碼寫 10% 有誤),三等獎 90/1000=9%(原碼寫 10% 有誤)。
嚴重邏輯缺陷:
nextInt 獨立,同一獎項可能重複中獎,導致實際發出獎品數量超過庫存(如 5 個一等獎可能發出 6+ 個)。public class Lottery {
// 獎池:每個元素代表一張獎券
private final List<String> pool = new ArrayList<>();
private int cursor = 0;
public Lottery() {
// 初始化獎池
addPrizes("一等獎-免單", 5);
addPrizes("二等獎-升艙", 10);
addPrizes("三等獎-貴賓室", 100);
addPrizes("未中獎", 885); // 總共 1000
Collections.shuffle(pool); // 洗牌
}
private void addPrizes(String prize, int count) {
for (int i = 0; i < count; i++) pool.add(prize);
}
// 線程安全抽獎
public synchronized String draw() {
if (cursor >= pool.size()) return "獎池耗盡";
return pool.get(cursor++);
}
}
多實例部署時,需將獎池放入 Redis,使用 Lua 腳本原子執行 LPOP 或 RPOP 保證線程安全與一致性。