02. 彩票隨機號碼

在[1,m]個數(shù)字區(qū)間生成彩票的n個不同隨機號碼。
如果常規(guī)思考,生成數(shù)字存到數(shù)組中,再隨機生成數(shù)字與數(shù)組中的比較。
如果隨機生成的數(shù)字與數(shù)組中已生成的數(shù)字不相同就存入數(shù)組,否則就舍棄,重新隨機生成。
理論上存在極低極低的概率臉很“黑”,一直隨機出現(xiàn)過的數(shù)字,那么這個程序的運行時間存在著無窮大的情況。
如何在隨機n次就可以得到n個不同數(shù)字,我思考的思路如下

  1. 將[1,m]依次存入長度是m的數(shù)組,其下標是[0,m-1]
  2. 隨機第一個下標[0,m-1],假設(shè)為4,將下標4對應(yīng)的數(shù)字與下標m-1的進行交換
  3. 隨機第二個下標[0,m-2],假設(shè)還是4,將下標4對應(yīng)的數(shù)字與下標m-2的進行交換
  4. 隨機第三個下標[0,m-3],假設(shè)還是4,將下標4對應(yīng)的數(shù)字與下標m-3的進行交換
    ...

n. 隨機第n個下標,假設(shè)一直都是4,將下標4對應(yīng)的數(shù)字與下標m-n的進行交換
這樣,雖然一直隨機的都是4,但下標4對應(yīng)的內(nèi)容每次都不同,所以n次隨機可以得到n個不同數(shù)字。
代碼:

public static int[] getRandomLottle(int m, int n) {
    int[] a = new int[m];
    int[] b = new int[n];
    //初始化數(shù)組a,范圍[1,m]
    for(int i = 0; i < m; i++) {
        a[i] = i+1;
    }
    
    int temp;
    //開始隨機n次
    for(int i = 0; i < n; i++) {
        Random r = new Random();
        //隨機范圍不斷縮小
        int idx = r.nextInt(m-i);
        b[i] = a[idx];
        //交換
        temp = a[idx];
        a[idx] = a[m-1-i];
        a[m-1-i] = temp;
    }
    
    Arrays.sort(b);
    return b;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,071評論 0 2
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,725評論 0 5
  • 記得小時候看電視劇,有個心理醫(yī)生在劇里說習慣是可怕的第二上帝!不知怎么這句話讓我印象深刻!多少年后,當我從一個天真...
    記得向前進閱讀 339評論 0 0
  • 這夢太真實,現(xiàn)實如夢境
    午夜掏心FM閱讀 577評論 7 10
  • 這次帶你制作一個麥克風圖標,本教程通俗易懂,上手快,效果贊,但是需要同學們用心制作,等不及的雙手快點來試試吧。 最...
    a104b284f747閱讀 2,272評論 1 7

友情鏈接更多精彩內(nèi)容