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; 
    } 
相关问题