我对Random有些问题。我需要从txt文件中选择一行,然后在按钮点击后将其传递到textview(每次都是不同的行)。我的代码在第一次点击期间只执行一次,但我想为每个按钮单击下一行显示。 (抱歉我的英语不好)-_-
public class MainActivity extends Activity {
long seed = System.nanoTime();
String newString1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
valueA();
Button buttonGenerate = (Button)findViewById(R.id.button1);
final TextView textGenerateNumber = (TextView)findViewById(R.id.textView1);
buttonGenerate.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
valueA();
textGenerateNumber.setText(newString1);
}});
}
public void valueA (){
Scanner s = new Scanner(getResources().openRawResource(R.raw.question));
ArrayList<String> list = new ArrayList<String>();
try {
while (s.hasNextLine() ) {
list.add(s.nextLine());
}
} finally {
s.close();
}
Random r = new Random(seed);
String a = list.get(r.nextInt(list.size()));
newString1 = a.substring(2);
}
}
第二个问题:
public class MainActivity extends Activity {
String newString1;
String newString2;
String newString3;
Random random = new Random(System.nanoTime());
.....
public void valueA (){
Scanner s = new Scanner(getResources().openRawResource(R.raw.question));
ArrayList<String> list = new ArrayList<String>();
try {
while (s.hasNextLine() ) {
list.add(s.nextLine());
}
} finally {
s.close();
}
String a = list.get(random.nextInt(list.size()));
newString1 = a.substring(2);
}
public void valueB (){
Scanner s = new Scanner(getResources().openRawResource(R.raw.answer));
ArrayList<String> list = new ArrayList<String>();
try {
while (s.hasNextLine() ) {
list.add(s.nextLine());
}
} finally {
s.close();
}
String b = list.get(random.nextInt(list.size()));
newString2 = b.substring(2);
}
答案 0 :(得分:2)
您的种子是MainActivity时创建的固定值。因此
new Random(seed)
将始终生成相同的值。而不是使用种子作为实例变量,而是使用随机
Random random = new Random(System.nanoTime());
并在valueA()方法中丢失新的Random行。
这样你就有了一个Random实例,用它来计算连续的nextInt值,而不是每次使用它时都计算一个新的Random。
修改:
要回答第二个问题,最好在newQuestion()方法中生成问题和答案,并使用getQuestion和getAnswer检索它们。这意味着您的valueA和valueB永远不会失去一步。
String question;
String answer;
void newQuestion() {
int rval = random.nextInt();
question = list.get(rval);
answer = list.get(rval);
}
String getQuestion() {
return(question);
}
String getAnswer() {
return(answer);
}
答案 1 :(得分:0)
private Random random = new Random();
random.setSeed(System.nanoTime());
以及稍后在您的Value方法中,随机获取。但是你不需要valueA()和valueB(),一个就足以得到正确的问题/答案:
public void value (){
Scanner answerScanner = new Scanner(getResources().openRawResource(R.raw.answer));
Scanner questionScanner = new Scanner(getResources().openRawResource(R.raw.question));
ArrayList<String> answerList = new ArrayList<String>();
ArrayList<String> questionList = new ArrayList<String>();
try {
while (answerScanner.hasNextLine() ) {
answerList.add(answerScanner.nextLine());
questionList.add(questionScanner.nextLine());
}
} finally {
s.close();
}
int nextInt = random.nextInt(questionList.size());
String answerString = answerList.get(nextInt);
String questionString = questionList.get(nextInt);
yourAnswerString = answerString.substring(2);
yourQuestionString = questionString.substring(2);
}