※ 引述《gcobc12632 (Ted)》之銘言:
: 假設我有一組陣列
: int i[] = {0, 1, 2, 3, 4, 5, 6, 7};
: 且 01為一組、23為一組、45為一組…以此類推,目前總共四組(可能有變動
: 然後我要從這組陣列當中,隨機取出 1~4 組數字
: 例1:隨機取出 4 組,隨機取出 01, 23, 45, 67
: 例2:隨機取出 2 組,隨機取出 23, 67
: 例3:隨機取出 3 組,隨機取出 01, 23, 67
: 大概是這樣…
: 這該怎麼寫呢?卡在這卡好久了
: -
: 原本我的寫法是:
: private int random1 = 0; //奇數
: private int random2 = 0; //偶數
: do {
: random1 = Utils.getRandomNumber(1, i.length);
: random2 = Utils.getRandomNumber(0, i.length);
: if (random1 % 2 == 0) {
: random1--;
: }
: if (random2 % 2 != 0) {
: random2++;
: }
: } while (random1 < random2);
: for (int i = random2; i < random1 + 1 ;i++) {
: Log.d("test", i);
: }
: 但是,這樣的話沒辦法得到我想要的結果:
: 因為這只會抓到連號(01, 23, 45),而不會抓到跳號(01, 45, 67)
: 而且機率也不會相同(抓到中間值的機率遠大於其他)
: 所以才上來發問,該怎麼寫呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.38.65.246
※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1447859932.A.8C2.html
你這個程式有一個架構上的問題
假設你的數據是「兩個一組」
那你應該用個class把他包起來,像是
class Point{
Point(int x,int y){this.x=x;this.y=y;}
int x,y;
}
之類的,這個可以簡化很多之後處理這個數據組的問題
第二個問題
是排列組合的問題,這排列組合其實不難,但是加上你的數據組的問題之後
等於是把兩個簡單的問題,變成一個複雜的問題
但如果妳把兩個數據包成一個class之後
就可以用很簡單的方式做出來
<T> <= 這是泛型
public static <T> List<T> getRand(List<T> t,int num){
//裝答案用的List
ArrayList<T> ans=new ArrayList<>(num);
//取num個答案
for (int i=0;i<num;i++){
//亂數從列表中取一個
int key=(int)(Math.random()*t.size());
//從列表中移除選中的目標,並放到答案列表中
ans.add(t.remove(key));
}
return ans;
}
所以是這樣用
//生成清單
ArrayList<Point> l=new ArrayList<>();
for (int i=0;i<10;i++){
l.add(new Point(i*2,i*2+1));
}
/隨機取3個
List<Point> r=getRand(l,3);
//列印答案
for (Point p:r){
System.out.println("("+p.x+","+p.y+")");
}