2012-03-16 63 views
-2

我有這種方法會產生隨機問題,我希望能夠生成每個問題一次,但不超過一次。 我該怎麼做?如何檢查字符串是否只生成一次

這是迄今爲止代碼:

package boss; 
import java.util.Random; 
import javax.swing.JFrame; 


public class Boss { 
    public static void main(String[] args) { 

     LoginWindow window = new LoginWindow(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setVisible(true); 
    } 

    public String getQuestions() { 
     String [] question = new String[30]; 
     question[0] = "hello"; 
     question[1] ="yo"; 
     question[2] ="b"; 
     question[3] ="ha"; 

     //Generating random questions 
     Random r = new Random(); 
     int i=r.nextInt(4); 
     String quest=question[i]; 
     return quest; 
    } 
} 
+3

嗯,跟蹤你已經選擇了的人的。 – 2012-03-16 00:59:14

+0

創建一個ArrayList,如果它不在列表中,那麼將其添加。否則重新循環。 – 2012-03-16 00:59:52

回答

1

你必須保持你已經對那些名單使用和檢查。

boolean used[] = new boolean[30]; 
int i; 

do { 
    Random r = new Random(); 
    i=r.nextInt(4); 

} while(used[i] == true); 

String quest=question[i]; 
used[i] = true; 
4

使用ArrayList,而不是一個表。在顯示的時候從ArrayList中移除顯示的問題。

+0

並且改變正在生成的隨機數的範圍,因爲您現在有更少的問題。 – 2012-03-16 01:07:35

1

一個相當簡單的解決辦法是保持你問的所有問題記錄,並只產生你沒有的:

private ArrayList<Integer> questionsAsked = new ArrayList<>(); 

public String getQuestions() 
{ 
    String [] question = new String[30]; 
    question[0] = "hello"; 
    question[1] ="yo"; 
    question[2] ="b"; 
    question[3] ="ha"; 

    //Generating random questions 
    Random r = new Random(); 
    int i = r.nextInt(question.length); 

    //keep looping until you find a question you have not asked  
    while(questionsAsked.contains(i)) 
    { 
     i = r.nextInt(question.length); 
    } 

    //add that question to the list of questions already asked 
    questionsAsked.add(i); 

    //ask the question 
    return question[i]; 
} 
0

跟蹤您已選擇的內容。

String [] question = new String[30]; 
boolean[] picked = new boolean[30]; 
... 
if (!picked[i]) 
{ 
    String quest=question[i]; 
    picked[i] = true; 
} 
else 
    // choose another 

(顯然,您需要調整您的代碼,同時也對付知道什麼時候你已經枯竭型你的問題的供應和所有的都被接走)

5

你不是產生在你的榜樣的問題 - 你從存儲在數組中的固定集合中選取它們。這聽起來像你只是想洗牌陣列,然後遍歷其中的一部分,直到你看到了所需的問題數量。所以 - 建議你洗牌的問題,然後只是遍歷洗牌數組,或洗牌索引0..n的數組,並遍歷問題的原始列表中的那些。

有很多方法進行混洗,也許最簡單的方法是對輸入數據進行一次遍歷,將每個元素與其他隨機選擇的元素進行交換。

+3

用於'shuffle()'的+1,示例[here](http://stackoverflow.com/a/2524394/230513)。 – trashgod 2012-03-16 01:12:29

1

您可以用隊列中刪除和懶惰問題的產生,例如工作一起使用Collections.shuffle

import java.util.*; 

public class Mkt { 
    private Queue<String> questions = null; 

    public Mkt() { 
    for(int i = 0; i < 10; i++) { 
     System.out.println(getQuestion()); 
    } 
    } 

    public String getQuestion() { 
    if(questions == null || questions.size() == 0) { 
     questions = generateQuestions(); 
    } 
    return questions.remove(); 
    } 

    private Queue<String> generateQuestions() { 
    List<String> list = Arrays.asList("hello", "yo", "b", "ha"); 
    Collections.shuffle(list); 
    return new LinkedList<String>(list); 
    } 

    public static void main(String[] args) { 
    new Mkt(); 
    } 
} 

採樣運行:

$ javac Mkt.java && java Mkt 
ha 
yo 
hello 
b 
b 
ha 
hello 
yo 
hello 
ha 
1

你可以用一個「洗牌」的算法解決這個問題。基本上隨機(洗牌)你的數組,然後從列表中選擇下一個項目。

最簡單的一種洗牌算法是Knuth的:http://en.wikipedia.org/wiki/Knuth_shuffle

僞洗牌您的數組:

Random rand = new Random(); 
    for (int i=questions.Length-1; i>=0; --i) 
    { 
     int nextRand = rand.Next(i); 

     // Switch the randomly selected 'next' to the current pointer in the array 
     string temp = questions[nextRand]; 
     questions[nextRand] = i; 
     questions[i] = temp; 
    } 
相關問題