欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java random.nextInt的坑及解決

 更新時間:2021年09月22日 16:42:21   作者:朝著希望前進  
這篇文章主要介紹了java random.nextInt的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java random.nextInt的坑

下面的代碼

Random random = new Random();
Integer code = random.nextInt(len);

很簡單的兩句代碼,需要注意兩點

第一:nextInt的取值是[0,n) ,不包括n。如果是隨機list,直接傳list的size,不用擔心下標越界。

api說明:

Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive)

第二個:nextInt在數(shù)據(jù)量小的時候,重復概率比較高。比如現(xiàn)在有一個大小為6的list,我希望隨機顯示4條且不重復。正確的做法是每次得到隨機數(shù)后,移除下標對于的對象。這樣即使random重復了也沒關系,因為下標對應數(shù)據(jù)移除后,同樣的下標對應的對象是不一樣的。

千萬別像我之前的做法,遍歷list,然后隨機取到下標后,再去重。這樣有時能得到4個,有時得不到。比如下標會出現(xiàn) 5,1,1,1,2,1.這樣的話,最終list只會有三個。

之前一直沒有懷疑是這段代碼的問題,懷疑接口不穩(wěn)定或者是數(shù)據(jù)不完整之類的。查日志還一直在看接口傳遞參數(shù)和返回參數(shù),結(jié)果是因為對nextInt理解不深刻,在我印象中感覺randomInt是隨機數(shù)且不重復的,不過事實證明我想多了。

java random.nextInt()不隨機性

最近在研究算法,也寫一些小程序,其中有一個是《算法導論》中的習題:描述RANDOM(a, b)過程的一種實現(xiàn),它只調(diào)用RANDOM(0, 1),作為a和b的函數(shù),你的程序的期望時間運行時間是多少?

這個題在網(wǎng)上已經(jīng)有很多人給出了答案

我也自己寫了一個算法,不過本文的主題不是針對這個問題,而是RANDOM(0, 1)的實現(xiàn)方法。我剛開始使用的是random.nextInt(0, 1)來取隨機的0和1,也測試了其“隨機性”,代碼如下:

 //用Random.nextInt(2)獲取0,1隨機數(shù)
 //獲取概率均為0.5,但不隨機
 public int randomBase0() {
  Random r = new Random();
  return r.nextInt(2);
 }

用for循環(huán)10000萬次,得到的0和1大致相當,可以得出獲得0和1的概率為0.5。但之后我就遇到了麻煩,我寫了一個方法去實現(xiàn)RANDOM(a, b),例如RANDOM(0, 3),得到的結(jié)果是:

0有8335個

1有825個

2有42個

3有798個

我的算法是

將b-a+1擴展到2的最小冪級數(shù),如果是個數(shù)為5,則取8(2^3),如果為16,則取16(2^4),然后用分治算法獲取a與b之間的數(shù),其中需要將大于b的數(shù)去除掉,重新獲取。

我原本以為我寫RANDOM(a, b)的算法錯了。后來又寫了一個算法,是網(wǎng)上很多人使用的算法,是將隨機產(chǎn)生的0和1拼成2進制數(shù),然后轉(zhuǎn)換為十進制數(shù),在一個區(qū)間內(nèi)在有效,超過這個區(qū)間則排除重取。

用這個算法得到的結(jié)果與第一種算法結(jié)果相同。我只好把第二種算法的二進制數(shù)打印出來查找原因,發(fā)現(xiàn)一個問題,就是0或1連續(xù)出現(xiàn)的概率要比0和1交叉出現(xiàn)的概率大,我想既然是隨機產(chǎn)生0和1,那這兩個生成的概率應該相同才對。

因此我得出結(jié)論,使用Random.nextInt(0, 1)獲取隨機數(shù)的概率并不隨機,原因是其生成連續(xù)相同0或1的概率與生成交叉0和1的概率不等,并且前者大于后者,盡管單獨獲取0和1的個數(shù)比相當,換句話說,用這種方法獲取0和1的事件不獨立。

驗證如下

 //檢測Random.nextInt(2),連續(xù)獲取兩位0和1隨機數(shù)
 public int randomBaseS() {
  String s = new String(new StringBuffer().append(getBoolean()).append(getBoolean()));
  
  if("00".equals(s)){
   return 0;
  }else if("01".equals(s)){
   return 1;
  }else if("10".equals(s)){
   return 2;
  }else{
   return 3;
  }
 }
 //獲取隨機數(shù)二進制字符串
 public String getBoolean(){
  return new String(new Integer(randomBase0()).toString());
 }

使用for循環(huán)10000次,得到的計數(shù)結(jié)果如下:

"00"有4145個

"01"有928個

"10"有905個

"11"有4022個

那哪種算法能滿足要求呢?如下:

 //用Math.random()獲取0,1隨機數(shù)
 //獲取概率均為0.5,且隨機
 public int randomBase() {
  return Math.random()>0.5?1:0;
 }

以上面的方法為基礎,用for循環(huán)獲取[0, 3]之間的整數(shù),得到的結(jié)果如下:

0有2525個

1有2551個

2有2433個

3有2491個

滿足要求,哈哈!

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java double類型比較大小詳解

    Java double類型比較大小詳解

    這篇文章主要介紹了Java double類型比較大小,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java基礎之內(nèi)存泄漏與溢出詳解

    Java基礎之內(nèi)存泄漏與溢出詳解

    今天帶大家來了解一下Java內(nèi)存泄漏與溢出的知識,文中有非常詳細的介紹,對正在學習Java基礎的各位小伙伴呢很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • 基于java 線程的幾種狀態(tài)(詳解)

    基于java 線程的幾種狀態(tài)(詳解)

    下面小編就為大家?guī)硪黄趈ava 線程的幾種狀態(tài)(詳解)。小編覺得挺不錯的,現(xiàn)在就想給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java框架之Maven SSM集合

    Java框架之Maven SSM集合

    本篇文章主要介紹了基于maven的ssm框架整合的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • Mybatis Plus 增刪改查的實現(xiàn)(小白教程)

    Mybatis Plus 增刪改查的實現(xiàn)(小白教程)

    本文主要介紹了Mybatis Plus 增刪改查,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • springboot整合mybatis將sql打印到日志的實例詳解

    springboot整合mybatis將sql打印到日志的實例詳解

    這篇文章主要介紹了springboot整合mybatis將sql打印到日志的實例詳解,需要的朋友可以參考下
    2017-12-12
  • RabbitMQ進階之消息可靠性詳解

    RabbitMQ進階之消息可靠性詳解

    這篇文章主要介紹了RabbitMQ進階之消息可靠性詳解,abbitmq消息的投遞過程中,怎么確保消息能不丟失,這是一個很重要的問題,哪怕我們做了Rabbitmq持久化,也不能保證我們的業(yè)務消息不會被丟失,需要的朋友可以參考下
    2023-08-08
  • Java生成范圍內(nèi)隨機整數(shù)的三種方法

    Java生成范圍內(nèi)隨機整數(shù)的三種方法

    在Java中生成隨機數(shù)的場景有很多,下面這篇文章主要給大家介紹了關于Java生成范圍內(nèi)隨機整數(shù)的三種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Springboot調(diào)整接口響應返回時長詳解(解決響應超時問題)

    Springboot調(diào)整接口響應返回時長詳解(解決響應超時問題)

    當后端對于數(shù)據(jù)量較大的處理或是某些耗時的操作時,需要先對請求接口的請求進行響應,下面這篇文章主要給大家介紹了關于Springboot調(diào)整接口響應返回時長(解決響應超時問題)的相關資料,需要的朋友可以參考下
    2023-01-01
  • 一篇文章教你如何在SpringCloud項目中使用OpenFeign

    一篇文章教你如何在SpringCloud項目中使用OpenFeign

    這篇文章主要介紹了SpringCloud 使用Open feign 優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-08-08

最新評論