Yftach Srur
Yftach Srur

Reputation: 3

How can you make a random not repeat it self?

I'v created a list of strings which I choose randomly to display, and so I want to make it that it won't repeat its self. How can I do that.

public class qustionsActivity extends AppCompatActivity {

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

    final String[] questions = getResources().getStringArray(R.array.coupleQuestions);
    final String randomQuestions = questions[new Random().nextInt(questions.length)];

    final TextView theQuestion = findViewById(R.id.theQustion);

    theQuestion.setText(randomQuestions);

    Button nextQuestion = findViewById(R.id.nextQuestion);

    nextQuestion.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String randomQuestions = questions[new Random().nextInt(questions.length)];
            theQuestion.setText(randomQuestions);

        }
    });
}

The reason that I have two "randomQuestions" string is because I want a question to display as soon as you get into the activity and that on the click of a button it will randomise a new string.

Upvotes: 0

Views: 96

Answers (4)

Joop Eggen
Joop Eggen

Reputation: 109547

Instead of everytime randomizing the pick, you can randomly shuffle the questions and sequentially take the next (random) question.

private final List<String> randomQuestions;
private int questionI;

// Cycling endlessly    
private String nextQuestion() {
    String question = randomQuestions.get(questionI);
    ++questionI;
    if (questionI > randomQuestions.size()) {
        questionI = 0;
    }
}

// Once through the list:    
private String nextQuestion() {
    return randomQuestions.remove(0); // Always take the first, removing it.
}

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

    final String[] questions = getResources().getStringArray(R.array.coupleQuestions);
    randomQuestions = Collections.shuffle(Arrays.asList(questions));

Upvotes: 2

Saurav Kumar
Saurav Kumar

Reputation: 970

Use ArrayList to store your questions and after every retrieval of a question from a random index value, remove the same from ArrayList Below is the code:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    metadata = getIntent().getStringExtra("metadata");
    final ArrayList<String> questions = new ArrayList<String>(Arrays.asList(getResources().getStringArray(R.array.questions)));
    int i=new Random().nextInt(questions.size());
    final String randomQuestions = questions.get(i);
    questions.remove(i);
    final TextView theQuestion = findViewById(R.id.theQustion);

    theQuestion.setText(randomQuestions);

    Button nextQuestion = findViewById(R.id.nextQuestion);

    nextQuestion.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(questions.size()==0)   //To make sure we don't access the empty ArrayList
            {
                theQuestion.setText("End of questions");
                return;
            }
            int i=new Random().nextInt(questions.size());
            String randomQuestions =questions.get(i);
            questions.remove(i);
            theQuestion.setText(randomQuestions);

        }
    });
}

Upvotes: 0

pacataque
pacataque

Reputation: 140

Maybe you can create a list where you put the list of existing number like :

public class qustionsActivity extends AppCompatActivity {

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

    int a=new Random().nextInt(questions.length);

    final String[] questions = getResources().getStringArray(R.array.coupleQuestions);
    ArrayList<Integer> existingNumber=new ArrayList<>();

    final String randomQuestions = questions[a];

    existingNumber.add(a);

    final TextView theQuestion = findViewById(R.id.theQustion);

    theQuestion.setText(randomQuestions);

    Button nextQuestion = findViewById(R.id.nextQuestion);

    nextQuestion.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            do{
                 a=new Random().nextInt(questions.length);
            }while(!existingNumber.add(a))
            String randomQuestions = questions[a];
            theQuestion.setText(randomQuestions);
        }
    });
}

Upvotes: 1

Majva
Majva

Reputation: 150

public class qustionsActivity extends AppCompatActivity {

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

final String[] questions = getResources().getStringArray(R.array.coupleQuestions);
final int index = new Random().nextInt(questions.length);
final String randomQuestions = questions[index];
questions[index] = questions[questions.length-1];

final TextView theQuestion = findViewById(R.id.theQustion);

theQuestion.setText(randomQuestions);

Button nextQuestion = findViewById(R.id.nextQuestion);

nextQuestion.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        String randomQuestions = questions[new Random().nextInt(questions.length-1)];
        theQuestion.setText(randomQuestions);

    }
});

}

Upvotes: 0

Related Questions