Генерация случайных чисел с одинаковыми парами от 1 до 8? - PullRequest
3 голосов
/ 25 февраля 2010

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

Ответы [ 4 ]

2 голосов
/ 25 февраля 2010

Следующее сделает работу, я думаю:

import java.util.*;

class Randoms {
  public static void main(String[] args) {
    List<Integer> randoms = new ArrayList<Integer>();
    Random randomizer = new Random();
    for(int i = 0; i < 8; ) {
      int r = randomizer.nextInt(8) + 1;
      if(!randoms.contains(r)) {
        randoms.add(r);
        ++i;
      }
    }
    List<Integer> clonedList = new ArrayList<Integer>();
    clonedList.addAll(randoms);
    Collections.shuffle(clonedList);

    int[][] cards = new int[8][];
    for(int i = 0; i < 8; ++i) {
      cards[i] = new int[]{ randoms.get(i), clonedList.get(i) };
    }

    for(int i = 0; i < 8; ++i) {
      System.out.println(cards[i][0] + " " + cards[i][1]);
    }
  }
}

Один пример вышеописанного дает:

1 2
8 6
4 3
3 7
2 8
6 1
5 5
7 4

Надеюсь, это поможет.

1 голос
/ 25 февраля 2010

Как правило, если вы поместите числа, которые вы хотите сгенерировать, в массив (в вашем случае это массив длиной 16 с двумя по 1, 2, ..., 8), а затем случайным образом перестановите массив, вы будете получить то, что вы хотите. Вы можете случайным образом перестановить массив, используя код здесь .

0 голосов
/ 29 апреля 2012

Я сделал так:

    Random random = new Random();
    List<Integer> listaCartoes = new ArrayList<Integer>();

    for(int i=0; i<8;)
    {
       int r = random.nextInt(8) + 1;
       if(!listaCartoes.contains(r)) 
       {
          listaCartoes.add(r);
          listaCartoes.add(r);
          ++i;
       }
    }

    Collections.shuffle(listaCartoes);

Надеюсь, это поможет ^ _ ^

0 голосов
/ 25 февраля 2010

Полагаю, это ясно показывает вам, как подойти к проблеме:

public static List<Integer> shuffled8() {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 1; i <= 8; i++) {
        list.add(i);
    }
    Collections.shuffle(list);
    return list;
}

public static void main(String[] args) {
    List<Integer> first = shuffled8();
    List<Integer> second= shuffled8();
    for (int i = 0; i < 8; i++) {
        System.out.println(first.get(i) + " " + second.get(i));
    }
}

shuffled8 просто возвращает список номеров от 1 до 8 в случайном порядке. Поскольку вам нужно два таких списка, вы вызываете его дважды и сохраняете в first и second. Затем вы соединяете first.get(i) с second.get(i), чтобы получить нужные свойства.

Чтобы обобщить это, если вам нужны триплеты, вы просто добавляете List<Integer> third = shuffled8();, а затем first.get(i), second.get(i), third.get(i) - это триплет, обладающий требуемыми свойствами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...