Re: [問題] 樂透不能重複問題

看板java作者 (小美)時間16年前 (2008/12/06 02:22), 編輯推噓15(1503)
留言18則, 5人參與, 最新討論串4/9 (看更多)
※ 引述《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)

12/06 23:21, , 1F
第一次選的範圍是46個數字,第二次選的範圍是45個數字
12/06 23:21, 1F

12/07 00:48, , 2F
以此類推
12/07 00:48, 2F

12/07 01:49, , 3F
用 List 叫 Collections.shuffle
12/07 01:49, 3F

12/07 02:25, , 4F
(int) Math.random() * 100 % 46 雖然這樣相對慢了點...
12/07 02:25, 4F

12/07 04:33, , 5F
剛還沒看到 Math.random.. 為什麼不用 Random nextInt
12/07 04:33, 5F

12/08 00:53, , 6F
為什麼//numbers[pick] = numbers[i];後 數字就會重覆?
12/08 00:53, 6F

12/08 10:53, , 7F
樓上 因為那樣不是兩數交換 而是直接覆蓋過去
12/08 10:53, 7F

12/10 13:09, , 8F
那為什麼pick = (int)(Math.random()*(Max-i) + i);這行
12/10 13:09, 8F

12/10 13:10, , 9F
不會出現重覆的數字??
12/10 13:10, 9F

12/10 13:18, , 10F
那行會出現有可能出現重複的
12/10 13:18, 10F

12/10 13:22, , 11F
pick是陣列索引值 選過可以再被選 而陣列內容不會重複
12/10 13:22, 11F

12/10 17:25, , 12F
不會重覆?不懂= =.如果二次pick都是20 那陣列[0][1]不是
12/10 17:25, 12F

12/10 17:28, , 13F
都換到陣列[20]的值
12/10 17:28, 13F

12/10 20:35, , 14F
第一次 a[0] = 1,a[20] = 21 交換後 a[0] = 21 a[20] = 1
12/10 20:35, 14F

12/10 20:39, , 15F
第二次 a[1]=2 , a[20]=1 交換後 a[1]=1 , a[20]=2
12/10 20:39, 15F

12/10 22:23, , 16F
了解了= =好詳細 謝謝你 高手^^
12/10 22:23, 16F

12/10 23:38, , 17F
我有回文修了幾行程式? 因為我覺得這程式結果有點小問題?
12/10 23:38, 17F

12/11 04:36, , 18F
回 janyfor: (int) Math.random() * 100 % 46機率不平均
12/11 04:36, 18F
文章代碼(AID): #19EN62dx (java)
討論串 (同標題文章)
文章代碼(AID): #19EN62dx (java)