如何用代碼實現真正公平的抽獎?

Donnie歐巴


先來看一個簡單的實現:先將50個人進行1到50編號,然後來一段簡單的java隨機數代碼,如下:


上圖中的代碼運行結果:

大家覺得這個抽獎設計的公平麼?歡迎下方留言討論~

這裡介紹一下Random及ThreadLocalRandom相關知識:

int random = ThreadLocalRandom.current().nextInt(50) + 1

在java中最直接、簡單的調用生成隨機數方式:

new Random().nextInt()

比如生成0.0到10.0之間的雙精度浮點數即:

new Random().nextDouble(10)

如果想生成整數即:

new Random().nextInt(10)

  • Random每次使用都得實例化一個對象

  • 多線程下使用單個Random實例生成隨機數時候,多個線程同時計算隨機數計算新的種子時候多個線程會競爭同一個原子變量的更新操作,由於原子變量的更新是CAS操作,同時只有一個線程會成功,所以會造成大量線程進行自旋重試,這是會降低併發性能的,所以ThreadLocalRandom應運而生。

  • 為了解決多線程高併發下Random的缺陷,JUC包下新增了ThreadLocalRandom類,如果每個線程維護自己的一個種子變量,每個線程生成隨機數時候根據自己老的種子計算新的種子,並使用新種子更新老的種子,然後根據新種子計算隨機數,就不會存在競爭問題,這會大大提高併發性能。

日常開發中,經常會有生成一批隨機數的需求,比如訂單號的後4位採用隨機數,隨機輪詢,隨機獲取系統默認頭像等,大家可以在高併發的場景中嘗試一下併發包中的ThreadLocalRandom,感興趣的同學可以去看看相關源碼。

少琮持續關注科技領域問答,歡迎大家下方留言討論,共同成長!感謝點贊、收藏、關注~


分享到:


相關文章: