我有这种生成随机问题的方法,我希望能够生成一次并且不超过一次的每个问题。 我怎么能这样做?
这是到目前为止的代码:
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;
}
}
答案 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
(显然,您需要重新构建代码,并且还要知道何时已经完成了问题供应并且所有问题都已被选中)