Java (генерация чисел без повторов) - PullRequest
0 голосов
/ 07 января 2012

Я делаю приложение, и код под ним должен генерировать 7 случайных чисел и выводить их на экран, и ни одно из чисел не должно совпадать с другим.

Я пробовал все способы сделать это,Я провел около 5 часов, проверяя его, получая второе мнение, и они говорят, что это должно работать, но это не так.Что оно делает?Он просто записывает на экран 7 случайных чисел, но в большинстве случаев встречаются дубликаты, в большинстве случаев приложение просто останавливается (ошибка), но в коде нет ошибок.Это только один из многих способов, которые я пробовал.Может кто-нибудь сказать мне, если что-то не так?или есть предложение?или будьте так любезны, чтобы дать мне пример кода, чтобы заменить цикл while?Любой совет будет отличным, учитывая, что я новичок в Java.

Обновление : цикл while является основным циклом.он вызывает метод чисел и создает 7 случайных чисел и сохраняет их в массиве "text_counter", затем я проверяю, являются ли они повторяющимися числами в массиве, если нет, он выходит из цикла и выводит их на экранесли он есть, он возвращается к началу цикла, чтобы генерировать больше случайных чисел и проверять их снова.

Вот код

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Lotto extends Activity {

/** Called when the activity is first created. */
Random dice = new Random();
TextView top, med, and, qcounter, wcounter, ecounter, rcounter, tcounter,
        ycounter, ucounter;
@SuppressWarnings("rawtypes")
Set uniqueItems = new HashSet();
Button gen;
EditText input1, input2;
int[] text_counter = { 1, 2, 3, 4, 5, 6, 7 };
boolean o = false;
boolean oo = false;
boolean ooo = false;
int text1;
int pre_text2;
int count = 0;
int text2;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.lotto_xml);
    gen = (Button) findViewById(R.id.b_gen);
    // ////////////////////////////////////// text view var
    qcounter = (TextView) findViewById(R.id.q_lotto);
    wcounter = (TextView) findViewById(R.id.w_lotto);
    ecounter = (TextView) findViewById(R.id.e_lotto);
    rcounter = (TextView) findViewById(R.id.r_lotto);
    tcounter = (TextView) findViewById(R.id.t_lotto);
    ycounter = (TextView) findViewById(R.id.y_lotto);
    ucounter = (TextView) findViewById(R.id.u_lotto);
    // ////////////////////////////////////////////////////
    final EditText input1 = (EditText) findViewById(R.id.et_min);
    final EditText input2 = (EditText) findViewById(R.id.et_max);

    gen.setOnClickListener(new View.OnClickListener() {

        @SuppressWarnings({ "unchecked" })
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            o = false;
            oo = false;
            count = 0;

            while (o == false) {
                number();
                count = 0;
                for (int i = 0; i < text_counter.length; i++) {
                    if (!uniqueItems.add(text_counter[i])) {
                        count = count + 1;
                    }

                }

                if (count == 0) {
                    o = true;
                }

            }

            qcounter.setText(String.valueOf(text_counter[0]) + ",");
            wcounter.setText(String.valueOf(text_counter[1]) + ",");
            ecounter.setText(String.valueOf(text_counter[2]) + ",");
            rcounter.setText(String.valueOf(text_counter[3]) + ",");
            tcounter.setText(String.valueOf(text_counter[4]) + ",");
            ycounter.setText(String.valueOf(text_counter[5]) + ",");
            ucounter.setText(String.valueOf(text_counter[6]));

        }


        private void number() {
            // TODO Auto-generated method stub
            text1 = Integer.parseInt(input1.getText().toString());
            text2 = Integer.parseInt(input2.getText().toString());
            text2 = text2 - text1;
            text2 = text2 + 1;
            for (int i = 0; i < 7; i++) {
                text_counter[i] = text1 + dice.nextInt(text2);
            }
        }

    });

}
}

Ответы [ 4 ]

6 голосов
/ 07 января 2012

Вы никогда не очищаете HashSet с именем uniqueItems. Вы должны очищать его перед каждым циклом, иначе вы будете накапливать числа там вечно.

2 голосов
/ 07 января 2012

Вместо того, чтобы проверять, есть ли в массиве дубликаты, и повторять попытку, проверьте, есть ли последнее сгенерированное число в массиве, прежде чем добавлять его.Если это так, вы можете сгенерировать номер снова, не выбрасывая предыдущую работу.

1 голос
/ 07 января 2012

Есть много способов сделать это.

Простой способ - сгенерировать числа и поместить их в hashmap. Вы продолжаете генерировать, пока у вас не будет 7 уникальных чисел. Если вы попали в столкновение, вы регенерируете.

Лучшая идея, но которая использует больше памяти, состоит в том, чтобы иметь массив битов некоторого размера. Каждый бит представляет число. Затем вы генерируете случайные числа:

while (counter != 7){
  randomNumber= ...Random.nextInt();
  if ([randomNumber % bitArray.length] != 0){
     print(randomNumber % bitArray.length)
     [randomNumber % bitArray.length]= 0;
     counter++
   }    

}
0 голосов
/ 07 января 2012

Вместо создания всех новых чисел, как насчет следующих действий

private void number() {
    text1 = Integer.parseInt(input1.getText().toString());
    text2 = Integer.parseInt(input2.getText().toString());
    text2 = text2 - text1;
    text2 = text2 + 1;
    if (text2 < 7) {
        throw new IllegalArgumentException("Can not generate 7 unique renumbers between " + text1 + " and " + (text1 + text2));
    }
    int[] text_counter = new int[7];
    for (int i = 0; i < 7; i++) {
        boolean duplicate;
        do {
            text_counter [i] = text1 + dice.nextInt(text2);
            duplicate = false; // Starting assumption
            for (int j = 0; j < i; j++) {
                if (text_counter[j] == text_counter[i]) {
                    duplicate = true;
                }
            }
        } while (duplicate);
    }
}
...