gpt4 book ai didi

java - 随机元素的输出不应重复

转载 作者:行者123 更新时间:2023-12-01 17:55:37 25 4
gpt4 key购买 nike

我制作了一个测验应用程序,其中有一个包含问题、选择和正确答案的数组列表。我已经设置了问题将是随机的。但随机化的问题会重复一次或多次。我怎样才能设置每个问题只发生一次?问题库中是数组列表,测验 Activity 中是随机发生器和其他东西。代码:

    package amapps.impossiblequiz;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class QuestionLibrary {

private final String[] [] mChoices ={
{"1993", "1986", "1967"},
{"-260", "-272,15", "279,15"},
{"a plant","The active substance of marijuana" , "a spider"},
{"6", "10","8"},
{"12","15","10"},
{"Uranus","Neptune","Saturn"},
{"HCl","NaCl","CO"},
{"John F. Kennedy", "Richard Nixon","James A. Garfield"},
{"Canada","Denmark", "Greenland is an own state?"},
{"12","20","14"},
{"10","12","14"},
{"not","never","now"},
{"Leningrad","Wolgograd","Dimitrijgrad"}

};
private final String mQuestions[] = {
"When was the European Union founded?",
"How many Grad Celsius is one Kelvin?",
"What is THC?",
"How many legs has a spider?",
"How many stars has the European flag?",
"Which is the seventh planet from the sun?",
"What is the chemical formula of salt?",
"Who said: Ich bin ein berliner?",
"To which country belongs Greenland?",
"What is the result of: 2 + 2 *5?",
"How many mountains are higher than 8000 meter/26.246 ft?",
"A famous quote is: to be, or____ to be!",
"What is the name of Stalingrad nowadays?"

};
private final String mCorrectAnswers[] = {
"1993", "-272,15", "The active substance of marijuana",
"8", "12","Uranus","NaCl","John F. Kennedy",
"Denmark","12","14","not","Wolgograd"

};

private final List<Integer> indexes = new ArrayList<>();

public QuestionLibrary() {
for (int i = 0; i < mQuestions.length; ++i)
indexes.add(i);
}

private int index(int i) {
return indexes.get(i);
}

public String getQuestion(int a) {
return mQuestions[index(a)];
}

public String getChoice1(int a) {
return mChoices[index(a)][0];
}

public String getChoice2(int a) {
return mChoices[index(a)][1];
}

public String getChoice3(int a) {
return mChoices[index(a)][2];
}

public String getCorrectAnswer(int a) {
return mCorrectAnswers[index(a)];
}

public int getlength() {
return mQuestions.length;
}

public void shuffle() {
Collections.shuffle(indexes);
}
}

package amapps.impossiblequiz;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class QuizActivity extends AppCompatActivity {


private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mToggle;
private Toolbar mToolbar;
private MenuItem menuItem;
private Intent in;

private QuestionLibrary mQuestionLibrary = new QuestionLibrary();

private TextView mScoreView;
private TextView mQuestionView;
private Button mButtonChoice1;
private Button mButtonChoice2;
private Button mButtonChoice3;

private String mAnswer;
private int mScore = 0;
private int mQuestionNumber = 0;






@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);

QuestionLibrary q = new QuestionLibrary();
System.out.printf("Question:0 Choice:(%s, %s, %s) Answer:%s%n",
q.getChoice1(0), q.getChoice2(0), q.getChoice3(0), q.getCorrectAnswer(0));
q.shuffle();
System.out.printf("Question:0 Choice:(%s, %s, %s) Answer:%s%n",
q.getChoice1(0), q.getChoice2(0), q.getChoice3(0), q.getCorrectAnswer(0));

mToolbar = (Toolbar) findViewById(R.id.nav_action);

setSupportActionBar(mToolbar);

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

mToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
mDrawerLayout.addDrawerListener(mToggle);
mToggle.syncState();
getSupportActionBar().setDisplayHomeAsUpEnabled(true); //Able to see the Navigation Burger "Button"


NavigationView mNavigationView = (NavigationView) findViewById(R.id.nv1);
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener(){
@Override
public boolean onNavigationItemSelected(MenuItem menuItem){
switch (menuItem.getItemId()){
case(R.id.nav_stats):
Intent accountActivity = new Intent(getApplicationContext(),Menu2.class);
startActivity(accountActivity);
}
return true;
}
});



mScoreView = (TextView) findViewById(R.id.score);
mQuestionView = (TextView) findViewById(R.id.question);
mButtonChoice1 = (Button) findViewById(R.id.choice1);
mButtonChoice2 = (Button) findViewById(R.id.choice2);
mButtonChoice3 = (Button) findViewById(R.id.choice3);


updateQuestion();

//Start of Button Listener1
mButtonChoice1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//My logic for Button goes in here

if (mButtonChoice1.getText() == mAnswer) {
mScore = mScore + 1;
updateScore(mScore);
updateQuestion();
mQuestionLibrary.shuffle();


//This line of code is optional...
Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(QuizActivity.this, "Wrong... Try again!", Toast.LENGTH_SHORT).show();
mScore = 0;
updateScore(mScore);
updateQuestion();
mQuestionLibrary.shuffle();



}
}


});
//End of Button Listener1

//Start of Button Listener2
mButtonChoice2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//My logic for Button goes in here

if (mButtonChoice2.getText() == mAnswer) {
mScore = mScore + 1;
updateScore(mScore);
updateQuestion();
mQuestionLibrary.shuffle();



//This line of code is optional...
Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(QuizActivity.this, "Oh... wrong your score is 0", Toast.LENGTH_SHORT).show();
mScore = 0;
updateScore(mScore);
updateQuestion();
mQuestionLibrary.shuffle();



}
}


});
//End of Button Listener2

//Start of Button Listener3
mButtonChoice3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//My logic for Button goes in here

if (mButtonChoice3.getText() == mAnswer) {
mScore = mScore + 1;
updateScore(mScore);
updateQuestion();
mQuestionLibrary.shuffle();



//This line of code is optional...
Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(QuizActivity.this, "Come on, that was not so hard...", Toast.LENGTH_SHORT).show();
mScore = 0;
updateScore(mScore);
updateQuestion();
mQuestionLibrary.shuffle();



}
}


});
//End of Button Listener3

}


private void updateQuestion() {

if (mQuestionNumber < mQuestionLibrary.getlength()) {
mQuestionView.setText(mQuestionLibrary.getQuestion(mQuestionNumber));
mButtonChoice1.setText(mQuestionLibrary.getChoice1(mQuestionNumber));
mButtonChoice2.setText(mQuestionLibrary.getChoice2(mQuestionNumber));
mButtonChoice3.setText(mQuestionLibrary.getChoice3(mQuestionNumber));

mAnswer = mQuestionLibrary.getCorrectAnswer(mQuestionNumber);
mQuestionNumber++;
} else Toast.makeText(QuizActivity.this, "Last Question!", Toast.LENGTH_SHORT).show();

}
private void updateScore(int point) {
mScoreView.setText("" + mScore);

}


@Override //Makes that the "Burger" Item, shows the Drawer if someone clicks on the simbol
public boolean onOptionsItemSelected(MenuItem item) {
if (mToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}



}

最佳答案

我的理解是你想要:

  1. “真正随机”的问题,
  2. 每个问题仅询问一次。

为了解决这个问题,我会:

  1. 引入一个新类Question,其中包含某个问题的问题、选项和正确答案。
  2. 使用此类创建一个问题数组。
  3. 打乱问题数组(考虑使用 Fischer-Yates Shuffle 作为打乱算法)。随机播放可确保每个问题以随机顺序出现,出现的次数与数组中包含的次数相同。您希望随机播放一次,然后继续执行步骤 4。
  4. 最后,只需迭代数组并一一提出问题即可。

我更喜欢将问题结构化为 Question 类的对象,因为抽象使得管理、讨论、扩展等更容易。

希望这有帮助。 :)

<小时/>

编辑

为了帮助指导您,这里是 Question 类的一些骨架代码,您可以将其作为解决方案的基础:

public class Question {
//public fields (aka variables) are accessed using "questionObject.field"
public String question;
public String[] choices;
public String answer;

public Question(String question, String[] choices, String answer){
this.question = question;
//TODO: the same for choices and answer
}

public boolean isCorrect(String userInput){
//TODO: method that checks if answer is correct
}
}

然后,在 main 方法中,创建一个数组: Question[] questions = {new Question(___,___,___), new Question(___,___,___) etcetc}

随机排列该数组(例如使用 Fischer-Yates)。最后,迭代数组并使用 for 循环一一处理问题。

希望这能澄清问题:)

关于java - 随机元素的输出不应重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45129666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com