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

看板java作者 (小美)時間17年前 (2008/12/11 03:58), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串7/9 (看更多)
※ 引述《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
第一次是取0~45+1 第二次不是取0~44+1嗎??
12/11 09:20, 1F

12/11 09:31, , 2F
噗.打太快~= = 我了解那行的意思了 謝謝
12/11 09:31, 2F
文章代碼(AID): #19G1zl8K (java)
討論串 (同標題文章)
文章代碼(AID): #19G1zl8K (java)