如何检查字符串只生成一次

时间:2012-03-16 00:56:28

标签: java string random

我有这种生成随机问题的方法,我希望能够生成一次并且不超过一次的每个问题。 我怎么能这样做?

这是到目前为止的代码:

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;
    }
}

7 个答案:

答案 0 :(得分:5)

您没有在示例中生成问题 - 您是从存储在数组中的固定集中选择它们的。听起来你只是想要对数组进行洗牌,然后迭代它的一部分直到你看到所需数量的问题。所以 - 建议你改变问题,然后迭代乱序数组,或者对一组索引0..n进行洗牌,并迭代原始问题列表中的那些。

有很多改组的方法,也许最简单的是对输入数据进行单次传递,将每个元素与其他随机选择的元素进行交换。

答案 1 :(得分:4)

使用ArrayList而不是表。显示时,从ArrayList中删除显示的问题。

答案 2 :(得分: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];
}

答案 3 :(得分: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 :(得分: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

答案 5 :(得分:1)

你可以用“shuffle”算法来解决这个问题。基本上随机化(shuffle)您的数组,然后从列表中选择下一个项目。

最简单的随机播放算法之一是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;
    }

答案 6 :(得分:0)

跟踪您已经选择的内容。

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

(显然,您需要重新构建代码,并且还要知道何时已经完成了问题供应并且所有问题都已被选中)