Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。

如何產生不重複的亂數

如題

但是 我還要把亂數填入一個2維的陣列裡

重點是不能重復喔

如果可以的話 請測試產生 10000x10000的

還要考慮時間因素喔 我希望的是 迴圈跑完就產生完畢了

更新:

1.亂數的範圍是? 整數 0 ~ 327 ..........

2.每一個陣列元素裡,只放一個數字

3.承2.不能重複的定義是?

假如 1 被用掉 那其他位置就不能放 1

4.如果考慮時間要快,那就要花費比較多的記憶體空間

記憶體空間的使用 不能超過所產生陣列大小的 2 倍

更新 2:

Jackmis 大大 :

1.使用time來當作亂數的種子 還是有機會重復

我要求的是絕對不重複 如果我總共要產生 327...... 各亂數時 我要求的是 迴圈跑完 亂數就要產生完畢 重點是

每各亂數產生時間必須相同

你的 2. 3. 4. 疑問 還是看清楚我的問題 想想在回答好了

我是有一維陣列不重復的方法 但是二維想不出來才問人的

重點 是 產生每各亂數的時間要相同

真的麻煩各位大大想想

要怎麼解決這各問題

提示

b= arr[a];

arr[a]=arr[b];

arr[b]=b;

6 個解答

評分
  • 2 十年前
    最愛解答

    要同時滿足不重覆、每個亂數產生時間相同、迴圈跑完即產生完畢..

    再加上您的提示~~~  看到提示讓我直覺想到 "洗牌" 的動作...

    假設要將亂數填入 10x10 的二維陣列中

      int array[][]=new int[10][10];

    1. 做法是將會用到的數放到一維陣列中, 大小為100的陣列, 分別給予0~99的數

      int tmp[]=new int[100];

      for (int i=0;i<tmp.length;i++) tmp[i]=i;

    2. 將這一維陣列做洗牌 n 次, 隨機抽跟第0個交換(PS. 也可以任選2個互換)

      int swap,b;

      for (int n=0;n<5000;n++)

      {

        swap = (int)(Math.random()*100);

        b=tmp[0]; tmp[0]=tmp[swap]; tmp[swap]=b;

      }

    3. 再將洗過牌分別丟進2維陣列

      for (int i=0;i<10;i++)

        for(int j=0;j<10;j++)

          array[i][j]=tmp[i*10+j];

    不知這樣的解, 是不是您想要的呢?

  • 2 十年前

    Luke 大大的觀念也很清楚 不過阿政大大 最快寫出最接近的程式 所以只好把點數給他了 感謝各位大大 這麼熱心討論這各題目喔 真是相當感謝各位 ^^

    2006-04-13 01:40:45 補充:

    一歲小孩大大 真是不好意思 雖然學過資料結構

    老是搞不懂串列 堆疊 佇列 的程式要怎麼跑

    您又把您知道的程式分享一下 所以這次只好對不起您了

    以後還能跟您多多的學習 ^^

  • Luke
    Lv 4
    2 十年前

    我也想問亂數的範圍...

    舉例來說,如果你要的是 3 * 3 的亂數

    那亂數的限制是

    (1) 1 ~ 9 (0 ~ 8)

    (2) 沒有限制,亂數可以跳號(也就是程式中 Long Integer 的範圍)

    再來,你的程式的重點是

    (a) 速度優先

    (b) 記憶體優先

    2006-04-12 13:29:46 補充:

    以 (a) 來說,速度要達到最快時,額外記憶體的用量會等於亂數範圍

    這時候上一題你選 (1) 會比選 (2) 來得省記憶體,且 (1) 剛好會是「所產生陣列大小的 2 倍」

    如果上一題你選 (2),但又限制你的記憶體只能用到兩倍

    那麼你就是 (b) 選項,但是仍然可以做到「產生每各亂數的時間要相同」

    (事實上,我並不懂什麼時候「產生每各亂數的時間會不相同」

     我推測你想表達的意思是「不能每產生一個亂數就去和前面產生的亂數做比較」

     以及「不能發現亂數重覆時才重新取一次亂數」)

    2006-04-12 13:29:54 補充:

    最後,不知道你的一維陣列不重覆的方法是什麼

    因為 (我認為的) 最佳化做法,和陣列的維數並沒有任何關聯

  • 2 十年前

    使用LinkedList

    亂數的範圍就是佇列的大小

    當你使用remove()時,該元素就會被移除出這個佇列

    而產生不重複的亂數

  • 2 十年前

    1.可使用time來當作亂數的種子,就可以產生不同的亂數值

    2.我想不出來在一個陣列裡放兩個值的方法,所以請放心,不會有這個目題。

    3.承上題,無需定義

    4.用最老士的做法建立陣列int[][] XX = new int[1萬][1萬],也不會發生這個問題。

    程式請自行加油...^^

  • 2 十年前

    其實題目有點不清楚

    1.亂數的範圍是?

    2.每一個陣列元素裡,放的是一個數字還是一組數字?

    3.承2.不能重複的定義是?

    4.如果考慮時間要快,那就要花費比較多的記憶體空間。

還有問題嗎?立即提問即可得到解答。