Как выбрать случайные значения из заданного диапазона - PullRequest
4 голосов
/ 27 августа 2010

Я пытаюсь создать приложение для Android, которое будет генерировать случайные серии значений (в данном случае целые числа) в заданном диапазоне (но НЕ равно между ними) и отображать их в простом TextView.

Допустим, у нас есть диапазон R = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Каждый раз, когда я нажимаю кнопку «Генерировать» Я хочу случайным образом генерировать 5 разных результатов

Пример для каждого «Генерировать»:

  • 4, 9, 2, 12, 10
  • 5, 1, 6, 8, 13
  • 10, 4, 6, 8, 2
  • и т.д ...

РЕДАКТИРОВАТЬ (работает сейчас) Спасибо за помощь!

public class random extends Activity {


static final Integer[] data = new Integer[] {
    1, 2, 3, 4, 5, 6, 7, 8
    };


@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    Random r = new Random();

    Set<Integer> mySet = new HashSet<Integer>();
    while (mySet.size() < 5) {
       int idx = r.nextInt(data.length);
       mySet.add(data[idx]);
    }

    String text = "";
    for (Integer i : mySet) {
       text = text + i + ", "; 
    }
       TextView Numbers = (TextView)findViewById(R.id.shownumbers);
       Numbers.setText(text);
  }
}

Ответы [ 6 ]

2 голосов
/ 28 августа 2010

в коде редактирования:

int idx = r.nextInt();

необходимо изменить на:

int idx = r.nextInt(data.length);

, поскольку вы хотите выбрать случайный индекс из ваших данных.

2 голосов
/ 27 августа 2010
Random r = new Random(<a seed number>);

Set<Integer> mySet = new HashSet<Integer>();
while (mySet.size() < 5) {
   int idx = r.nextInt(<length of your data>)
   mySet.add(data[idx]);
}

данные содержат номера вашего диапазона.

String text = "";
for (Integer i : mySet) {
   text = text + i + ", "; 
}

установите этот текст в TextView.

0 голосов
/ 28 января 2013
public int[] generateSeries(){
 int[] R = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
    int [] newarray=new int[5];
Collections.shuffle(Arrays.asList(R));
for(int i=0;i<5;i++)
{
  newarray[i]=R[i];
  System.out.println("values => "+R[i]);
}
return newarray;

Надеюсь, вам полно ...

0 голосов
/ 28 августа 2010
final StringBuilder builder = new StringBuilder();
final Random r = new Random(System.currentTimeMillis());
final Set<Integer> numbers = new HashSet<Integer>();

public String getRandomNumbers(int count,int min, int max)
{
    if(count > (max - min) || (max < min))
        throw new IllegalArgumentException("There is an error with the parameters provided");

    builder.setLength(0); //Clear StringBuilder
    numbers.clear(); //Clear the number list

    int i=0;
    while( i < count )
    {
        int aRandomNumber = (r.nextInt() % max) +min;

        if(numbers.contains(aRandomNumber)) // If we have seen this number already
            continue;
        else
        {
            i++;
            numbers.add(aRandomNumber);
            builder.append(aRandomNumber); //Add number to string

            if( i < (count-1) )
                builder.append(", "); // Add a comma if it's not the last number
        }
    }

    String output = builder.toString();
    builder.setLength(0); //A polite clearing
    numbers.clear();

    return output;
}
0 голосов
/ 27 августа 2010
int low = ...;
int high = ...;
List<Integer> choices = new LinkedList<Integer>();
for (int i = low; i <= high; i++) {
    choices.add(i);
} 

Collections.shuffle(choices);

int[] choices = new int[] {
  choices.get(0),
  choices.get(1),
  choices.get(2),
  choices.get(3),
  choices.get(4)
};
0 голосов
/ 27 августа 2010

Если я правильно понимаю, у вас все цифры должны быть уникальными.Вы можете заполнить список диапазоном, из которого хотите нарисовать.Каждый раз, когда вы выбираете значение из него, вы должны удалить его из списка, чтобы оно не было выбрано во второй раз.Я надеюсь, что это описание достаточно ясно.Если нет, я предоставлю код.

...