看板 java 關於我們 聯絡資訊
※ 引述《janyfor (妳哪位ㄚ)》之銘言: : 先將所有值放到陣列 : 依序選亂數打亂陣列 : 再取前6個值 : 參考參考 janyfor的方法是比較好的 運算複雜度比較低 不過所謂打亂陣列的地方可能要修改一下 以下我提供程式碼 int Max = 46; //亂數的最大值 int[] numbers = new int[Max]; for (int i=0 ; i<Max ; i++) numbers[i]=i;//陣列初始化 int n = 6; //你需要的亂數個數 int pick, temp; for(int i=0 ; i<n ; i++){ pick = (int)(Math.random()*(Max-i) + i);//重點在這裡 //Swapping temp = numbers[pick]; numbers[pick] = numbers[i]; numbers[i] = temp; } //Show出亂數 for(int i=0 ; i<n ; i++) System.out.println(numbers[i]); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 69.91.131.148 ※ 編輯: ninteen 來自: 69.91.131.148 (12/06 02:23)
yyc1217:第一次選的範圍是46個數字,第二次選的範圍是45個數字 12/06 23:21
yyc1217:以此類推 12/07 00:48
ogamenewbie:用 List 叫 Collections.shuffle 12/07 01:49
janyfor:(int) Math.random() * 100 % 46 雖然這樣相對慢了點... 12/07 02:25
ogamenewbie:剛還沒看到 Math.random.. 為什麼不用 Random nextInt 12/07 04:33
etman395:為什麼//numbers[pick] = numbers[i];後 數字就會重覆? 12/08 00:53
janyfor:樓上 因為那樣不是兩數交換 而是直接覆蓋過去 12/08 10:53
etman395:那為什麼pick = (int)(Math.random()*(Max-i) + i);這行 12/10 13:09
etman395:不會出現重覆的數字?? 12/10 13:10
janyfor:那行會出現有可能出現重複的 12/10 13:18
janyfor:pick是陣列索引值 選過可以再被選 而陣列內容不會重複 12/10 13:22
etman395:不會重覆?不懂= =.如果二次pick都是20 那陣列[0][1]不是 12/10 17:25
etman395:都換到陣列[20]的值 12/10 17:28
janyfor:第一次 a[0] = 1,a[20] = 21 交換後 a[0] = 21 a[20] = 1 12/10 20:35
janyfor:第二次 a[1]=2 , a[20]=1 交換後 a[1]=1 , a[20]=2 12/10 20:39
etman395:了解了= =好詳細 謝謝你 高手^^ 12/10 22:23
etman395:我有回文修了幾行程式? 因為我覺得這程式結果有點小問題? 12/10 23:38
ninteen:回 janyfor: (int) Math.random() * 100 % 46機率不平均 12/11 04:36