作者ninteen (小美)
看板java
標題Re: [問題] 樂透不能重複問題
時間Sat Dec 6 02:22:57 2008
※ 引述《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)
1F:推 yyc1217:第一次選的範圍是46個數字,第二次選的範圍是45個數字 12/06 23:21
2F:推 yyc1217:以此類推 12/07 00:48
3F:推 ogamenewbie:用 List 叫 Collections.shuffle 12/07 01:49
4F:推 janyfor:(int) Math.random() * 100 % 46 雖然這樣相對慢了點... 12/07 02:25
5F:推 ogamenewbie:剛還沒看到 Math.random.. 為什麼不用 Random nextInt 12/07 04:33
6F:推 etman395:為什麼//numbers[pick] = numbers[i];後 數字就會重覆? 12/08 00:53
7F:推 janyfor:樓上 因為那樣不是兩數交換 而是直接覆蓋過去 12/08 10:53
8F:推 etman395:那為什麼pick = (int)(Math.random()*(Max-i) + i);這行 12/10 13:09
9F:→ etman395:不會出現重覆的數字?? 12/10 13:10
10F:推 janyfor:那行會出現有可能出現重複的 12/10 13:18
11F:推 janyfor:pick是陣列索引值 選過可以再被選 而陣列內容不會重複 12/10 13:22
12F:推 etman395:不會重覆?不懂= =.如果二次pick都是20 那陣列[0][1]不是 12/10 17:25
13F:推 etman395:都換到陣列[20]的值 12/10 17:28
14F:推 janyfor:第一次 a[0] = 1,a[20] = 21 交換後 a[0] = 21 a[20] = 1 12/10 20:35
15F:→ janyfor:第二次 a[1]=2 , a[20]=1 交換後 a[1]=1 , a[20]=2 12/10 20:39
16F:推 etman395:了解了= =好詳細 謝謝你 高手^^ 12/10 22:23
17F:推 etman395:我有回文修了幾行程式? 因為我覺得這程式結果有點小問題? 12/10 23:38
18F:→ ninteen:回 janyfor: (int) Math.random() * 100 % 46機率不平均 12/11 04:36