无法使此代码正常工作
问题描述:
如何让它在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。请帮忙。
答
有一种已知的标准混洗方法。
- 随机挑选其中一个。如有必要,将您选择的那个与第四个位置的答案进行交换。
- 随机选择剩余答案1至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;
}
}
答
如果我正确理解你的目标,你想,随机混合的问题清单。 Rossum给了你一个方法来做到这一点,this是一个很好的介绍最知名的选项。
在我看来,这是最简单的方法:
- 创建地图的排序由键(如
TreeMap <Double,String>
或<Double,Question>
) - 添加一个随机密钥和问题作为值
- 循环通过并打印结果。一个foreach循环将使用排序顺序
不要担心重复的随机数或规范化它。 Dups不太可能,如果你需要一个问题#,在循环中添加一个计数器。
这是...不清楚这里发生了什么,或者你如何实施这个。基本上你试图得到一个没有重复的四个随机数列表? –
是的,这就是我想要做的。 – Alex