单击按钮后,文件中的Android随机字符串

时间:2015-01-27 12:47:23

标签: java android random

我对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);

       }

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)

像Neil Masson所说,制作一个全局随机,因为就像你做的那样,它会给你总是相同的结果。所以创建一个随机

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

   }