最直觀的方式:
double r = Math.random(); // 0.0 ~ 1.0
double r10 = Math.random() * 10; // 0.0 ~ 10.0
int rInt = (int) (Math.random() * 10); // 0 ~ 9
陷阱:Math.round(Math.random() * 10) 分布不均(0 和 10 機率僅為其他數字一半)。正確均勻寫法:(int) (Math.random() * 11) 或 Math.floor(Math.random() * 11)。
Random rnd = new Random();
int n = rnd.nextInt(10); // 0 ~ 9,均勻分布
boolean b = rnd.nextBoolean();
double gaussian = rnd.nextGaussian(); // 高斯分布
new Random(seed))、可產生多種型別。int n = ThreadLocalRandom.current().nextInt(10);
Math.random() 般便利,但效能更強。nextInt(origin, bound)、nextLong()、nextDouble() 等。| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
Math.abs(rnd.nextInt()) % n | 負數絕對值溢位、模運算偏差 | rnd.nextInt(n) |
new Random() 在迴圈中重複建立 | 種子相近導致序列重複 | 重用單一實例或用 ThreadLocalRandom |
直接用 Math.random() 做高併發 | 內部同步鎖爭用 | 改用 ThreadLocalRandom |
Math.random() 足矣。java.util.Random。ThreadLocalRandom。java.security.SecureRandom。隨機數看似簡單,分布均勻、執行緒安全、種子管理樣樣是坑。選對工具,事半功倍。