Захват случайного объекта из ArrayList не является случайным - PullRequest
0 голосов
/ 06 марта 2011

Я создаю метод, в котором, если вы передадите параметр типа Random, он вернет случайный объект. Вот в основном то, что я пытаюсь сделать:

public T choose(Random r) {
    int randomInt = r.nextInt(randomList.size()); // randomList is just a instance variable
    return randomList.get(randomInt);   
}

В случайном списке есть следующие строки: [2, 2, 2, 1, 1, 1, 1, c, c, c, a, a, a, a]

Затем я сделал драйвер со следующим кодом

 for (int i = 0; i < 10; i++) {
        System.out.print(rndList.choose(rnd)); // rnd is initialized as a static Random variable
    }

Однако мои выводы не выходят случайными. Я использовал отладчик и обнаружил, что мой метод выбора генерирует целое число, которое относительно мало, поэтому он всегда будет печатать 2 или 1, но никогда не с или с. Я не могу понять, почему это происходит, и помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ: проблема была решена. Я упустил много деталей, но когда я вызвал метод size (), я переписал это, и в нем была ошибка, которая возвращала меньшее число, чем мне бы хотелось. Спасибо dtech за то, что заметил мою глупую ошибку. Спасибо всем, кто пытался мне помочь!

Ответы [ 3 ]

4 голосов
/ 06 марта 2011

На первый взгляд в коде нет ничего плохого, поэтому это может быть случайный результат. Но ваш метод «Распечатай и проверь» очень ненадежен. Просто используйте что-то вроде этого:

final int N = 10000; // test 10.000 times
HashTable<Object, Integer> count = new HashTable(N);
for(int i=0;i < N;i++){
    Object o = rndList.choose(rnd);
    count.put(o, (count.get(o)==null?0:count.get(o))+1);
}
for(Map.Entry<Object, Integer> map : count.entrySet()){
    System.out.println(String.format("%s: %d", map.getKey().toString(), map.getValue()));
}

Это напечатает в среднем что-то вроде: 2: 1429 1: 2857 с: 2143 а: 2857

Только если числа отличаются существенно, вы должны быть обеспокоены.

Также убедитесь, что вы используете новый конструктор Random (), а не новый Random (somenumber). Если вы используете последний, вы будете каждый раз получать одну и ту же последовательность номеров.

1 голос
/ 06 марта 2011

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

public class Main<T> {
    private List<T> randomList = new ArrayList<T>();

    public  T choose(Random r) {
        int randomInt = r.nextInt(randomList.size()); // randomList is just a instance variable
        return randomList.get(randomInt);
    }


    public static void main(String... args) throws IOException, InterruptedException, ExecutionException {
        Main<String> rndList = new Main<String>();
        rndList.randomList.addAll(Arrays.asList("2, 2, 2, 1, 1, 1, 1, c, c, c, a, a, a, a".split(", ")));

        Random rnd = new Random();
        for (int i = 0; i < 10; i++) {
               System.out.print(rndList.choose(rnd)); // rnd is initialized as a static Random variable
           }

    }
}

печатает

1ca1caa1a2
1 голос
/ 06 марта 2011

отправляю вам случайный код инициализации, вы каждый раз получаете точно одинаковые результаты?Вы используете семя для создания объекта Random?

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