Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
如何產生不重複的亂數
如題
但是 我還要把亂數填入一個2維的陣列裡
重點是不能重復喔
如果可以的話 請測試產生 10000x10000的
還要考慮時間因素喔 我希望的是 迴圈跑完就產生完畢了
1.亂數的範圍是? 整數 0 ~ 327 ..........
2.每一個陣列元素裡,只放一個數字
3.承2.不能重複的定義是?
假如 1 被用掉 那其他位置就不能放 1
4.如果考慮時間要快,那就要花費比較多的記憶體空間
記憶體空間的使用 不能超過所產生陣列大小的 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];
不知這樣的解, 是不是您想要的呢?
- 網路礦工Lv 72 十年前
Luke 大大的觀念也很清楚 不過阿政大大 最快寫出最接近的程式 所以只好把點數給他了 感謝各位大大 這麼熱心討論這各題目喔 真是相當感謝各位 ^^
2006-04-13 01:40:45 補充:
一歲小孩大大 真是不好意思 雖然學過資料結構
老是搞不懂串列 堆疊 佇列 的程式要怎麼跑
您又把您知道的程式分享一下 所以這次只好對不起您了
以後還能跟您多多的學習 ^^
- LukeLv 42 十年前
我也想問亂數的範圍...
舉例來說,如果你要的是 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 補充:
最後,不知道你的一維陣列不重覆的方法是什麼
因為 (我認為的) 最佳化做法,和陣列的維數並沒有任何關聯
- 掌心球Lv 52 十年前
1.可使用time來當作亂數的種子,就可以產生不同的亂數值
2.我想不出來在一個陣列裡放兩個值的方法,所以請放心,不會有這個目題。
3.承上題,無需定義
4.用最老士的做法建立陣列int[][] XX = new int[1萬][1萬],也不會發生這個問題。
程式請自行加油...^^