2011-10-08 161 views
0

如何讓它在4行中的任意一行上隨機顯示答案,而不會有任何重複?無法使此代碼正常工作

我當前的代碼:這是負責對4條線路(隨機)

answer1.setText(answers_list[Type][randomValue+1 > 3 ? (randomValue+0)-4 : randomValue+0]); 
    answer2.setText(answers_list[Type][randomValue+2 > 3 ? (randomValue+1)-3 : randomValue+1]); 
    answer3.setText(answers_list[Type][randomValue+3 > 3 ? (randomValue+2)-2 : randomValue+2]); 
    answer4.setText(answers_list[Type][randomValue+0 > 3 ? (randomValue+3)-4 : randomValue+3]); 

目前一個採摘&添加問題

TextView question; 
private int qType = -1; 
private int asked = 0; 
private void QBegin() { 
    /* 
    * Gets a random question 
    */ 
    question = (TextView) findViewById(R.id.question); 
    String[] types = { "Q1", "Q2", "Q3", "Q4", "Q5"}; 
    Random random = new Random(); 
    int qType = random.nextInt(types.length); 
    question.setText(types[qType]); 
    asked++; 
    // StringList.add(types[qType]); 
    getAnswers(qType); 
/* if(StringList.contains(types[qType]) && asked >= types.length+1){ 
     asked = 0; 
     answerCounter.setText("THE END"); 
    } else if (StringList.contains(types[qType]) && asked < types.length+1){ 
     QBegin(); 
    } */ 
} 
    public static int random(int range) { 
    return (int)(java.lang.Math.random() * (range+1)); 
} 

public void shuffle(String input){ 
    /* 
    * Unused shuffle method 
    */ 
    List<Character> characters = new ArrayList<Character>(); 
    for(char c:input.toCharArray()){ 
     characters.add(c); 
    } 
    StringBuilder output = new StringBuilder(input.length()); 
    while(characters.size()!=0){ 
     int randPicker = (int)(Math.random()*characters.size()); 
     output.append(characters.remove(randPicker)); 
    } 
    System.out.println(output.toString()); 
} 
private void getAnswers(int Type) { 
    /* 
    * Getting answers here 
    */ 
    int randomValue = random(4); 
    try { 
    String answers_list[][] = { 
      {"Answer 1-1", "Answer 2-1", "Answer 3-1", "Answer 4-1"}, 
      {"Answer 1-2", "Answer 2-2", "Answer 3-2", "Answer 4-2"}, 
      {"Answer 1-3", "Answer 2-3", "Answer 3-3", "Answer 4-3"}, 
      {"Answer 1-4", "Answer 2-4", "Answer 3-4", "Answer 4-4"}, 
      {"Answer 1-5", "Answer 2-5", "Answer 3-5", "Answer 4-5"}} ; 
    answer1.setText(answers_list[Type][randomValue+1 > 3 ? (randomValue+0)-4 : randomValue+0]); 
    answer2.setText(answers_list[Type][randomValue+2 > 3 ? (randomValue+1)-3 : randomValue+1]); 
    answer3.setText(answers_list[Type][randomValue+3 > 3 ? (randomValue+2)-2 : randomValue+2]); 
    answer4.setText(answers_list[Type][randomValue+0 > 3 ? (randomValue+3)-4 : randomValue+3]); 


    /*for (int rows = 0; rows < answer&*list.length; rows++){ 
    for (int cols = 0; cols < answers_list[rows].length; cols++){ 
     } 
     }*/ 
    } catch(Exception ex){ 
    answer1.setText("Error "+ex); 
    } 



} 

代碼,我與ANSWER1並具有重複answer4。請幫忙。

+0

這是...不清楚這裏發生了什麼,或者你如何實施這個。基本上你試圖得到一個沒有重複的四個隨機數列表? –

+0

是的,這就是我想要做的。 – Alex

回答

1

有一種已知的標準混洗方法。

  1. 隨機挑選其中一個。如有必要,將您選擇的那個與第四個位置的答案進行交換。
  2. 隨機選擇剩餘答案1至3中的一個。如有必要,將您選擇的那個與第三個位置的答案進行交換。
  3. 隨機選擇其餘答案1至2中的一個。如有必要,將您選擇的那個與第二個位置的答案進行交換。

您現在有一個隨機順序包含原始四個答案的混洗列表。該算法被稱爲Fisher-Yates shuffle

ETA簡單的示例代碼:

Random rand = new Random(); 

String[] answers = { "42", 
        "Only on a Tuesday.", 
        "$4.36", 
        "Hieronymous K. Sluggenheimer III" }; 

// Shuffle answers[] 
for (int i = 3; i > 0; --i) { 
    // Pick an answer that hasn't yet been chosen. 
    int pick = rand.nextInt(i + 1); 
    if (pick != i) { 
     // Exchange answers[i] and answers[pick]. 
     String temp = answers[i]; 
     answers[i] = answers[pick]; 
     answers[pick] = temp; 
    } 
} 
+0

姆米,你能否爲我修改我的代碼,導致你的陳述對我有點困惑。 – Alex

+0

老實說:這對我沒有太大幫助:/ – Alex

1

如果我正確理解你的目標,你想,隨機混合的問題清單。 Rossum給了你一個方法來做到這一點,this是一個很好的介紹最知名的選項。

在我看來,這是最簡單的方法:

  1. 創建地圖的排序由鍵(如TreeMap <Double,String><Double,Question>
  2. 添加一個隨機密鑰和問題作爲值
  3. 循環通過並打印結果。一個foreach循環將使用排序順序

不要擔心重複的隨機數或規範化它。 Dups不太可能,如果你需要一個問題#,在循環中添加一個計數器。