Re: [問題] 樂透不能重複問題
※ 引述《ninteen (小美)》之銘言:
: ※ 引述《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]);
這個程式確實會出現0
如果不想出現0
把for (int i=0 ; i<Max ; i++) number[i]=i;
改成for (int i=0 ; i<Max ; i++) number[i]=i+1; 即可
至於Max-i這個地方是重點,不是我寫錯
基本精神是,取過的亂數不再取
也就是說
第一次取0~45,然後取出的亂數放到陣列的[0]的位置,一但放過去之後就不再動它
第二次取1~45,然後取出的亂數放到陣列的[1]的位置,一但放過去之後就不再動它
第三次取2~45,然後取出的亂數放到陣列的[2]的位置,一但放過去之後就不再動它
依此類推
希望這樣說明有清楚
原諒我不能畫圖很難說明
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 24.17.240.114
※ 編輯: ninteen 來自: 24.17.240.114 (12/11 04:09)
推
12/11 09:20, , 1F
12/11 09:20, 1F
推
12/11 09:31, , 2F
12/11 09:31, 2F
討論串 (同標題文章)