2010-08-27 3 views
4

Я пытаюсь создать приложение для Android, которое будет генерировать случайные ряды значений (целочисленные числа в этом случае) в заданном диапазоне (но NOT, равное между ними) и отображение они в простом 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
  • и т.д ...

EDIT (теперь работает) Спасибо за помощь!

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); 
    } 
} 
+0

В Clojure: (взять 5 (перетасовать (диапазон 1 14))) Теперь сравните, что предлагаемые решения Java здесь;) Слишком плохо Clojure на данный момент очень медленный на Android. –

ответ

2
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 + ", "; 
} 

этот текст в текстовом виде.

+0

Благодарим вас за ответ, пожалуйста, простите мою новизну, но как я могу присоединиться к ней в андроидной деятельности и распечатать ее в TextView? Кажется, я ошибаюсь, и приложение заставляет закрыться еще до того, как оно начнется. – thpoul

+0

Еще раз спасибо за ваш быстрый ответ! Я действительно ценю твою помощь. Я редактировал свое оригинальное сообщение, показывая, что я сделал. Должно быть что-то еще не так. – thpoul

0

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

0
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
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; 
} 
2

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

int idx = r.nextInt(); 

необходимо изменить, чтобы:

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

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

+0

Это была та часть, которая отсутствовала! Спасибо! – thpoul

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

надежда использовать полный к вам ....

Смежные вопросы