2016-01-27 3 views
-1

Так что я работаю над программой, которая должна случайно помещать людей в 6 комнат (окончательный вход - это список комнат с кем есть в каждой комнате). Поэтому я понял, как это сделать.Как сделать мой сортировщик комнаты более случайным?

 //this is the main sorting sequence: 
     for (int srtM = 0; srtM < Guys.length; srtM++) { 
     done = false; 
     People newMove = Guys[srtM]; //Guys is an array of People 
     while (!done) { 
      newMove.rndRoom(); //sets random number from 4 to 6 
      if (newMove.getRoom() == 4 && !room4.isFull()) { 
       room4.add(newMove); //adds person into the room4 object rList 
       done = true; 
      } else if (newMove.getRoom() == 5 && !room5.isFull()) { 
       room5.add(newMove); 
       done = true; 
      } else if (newMove.getRoom() == 6 && !room6.isFull()) { 
       room6.add(newMove); 
       done = true; 
      } 
     } 

Сейчас проблема заключается в том, что код по причинам, я не совсем понимаю (что-то с тем, как я писал здесь) вряд ли случайны. Кажется, что одни и те же люди попадают в одни и те же комнаты почти каждый раз, когда я запускаю программу. Например, меня почти всегда ставят этой программой в комнату 6 вместе с другим другом (интересно, мы оба в конце массива Guys). Итак, как я могу сделать это «по-настоящему» случайным? Или гораздо более случайным, чем сейчас?

Заранее благодарен!

Забыл упомянуть, что «rndRoom()» действительно использует стандартный метод случайного (на 4-6) в фоновом режиме:

public int rndRoom() { 
    if (this.gender == 'M') { 
     this.room = (rnd.nextInt((6 - 4) + 1)) + 4; 
    } 
    if (this.gender == 'F') { 
     this.room = (rnd.nextInt(((3 - 1) + 1))) + 1; 
    } 
    return this.room; 
} 
+1

Мы не сможем вам помочь, не видя больше вашего кода. Что делает метод 'rndRoom()' на 'People', например? Почему вы только назначаете людей в комнаты 4, 5 и 6? Что случилось с 1, 2, 3? – guitarsteve

+1

Не могли бы вы отправить метод _rndRoom_? – EJK

+0

Да, конечно - поэтому метод rndRoom просто полагается на стандартное случайное действие nextInt (которое находится внутри класса People). Комнаты 1-3 для девушек, пример кода здесь для комнат 4-6, которые для парней. – RoiB

ответ

0

ОК, так что я понял, почему результаты не кажутся очень случайно. Таким образом, комнатный сортировщик работает на основе алфавитного списка людей из 18 парней. Есть только 3 комнаты для парней (комнаты 4, 5 и 6). Таким образом, у каждого парня есть шанс на 1 в 3, чтобы сказать, номер 6. Но каждый человек мог только быть в двух из 6 мест в каждой комнате (в зависимости от где они находятся в списке).

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

Извините, если это сбивает с толку, но я понял, что причина в том, что сгенерированные списки комнат не выглядят очень случайными - это потому, что каждый раз в каждую комнату может быть помещено только одно и то же количество людей. Списки являются случайными, но это всего лишь порядок, в котором люди появляются в каждом списке, который не является случайным.

Так что для того, чтобы сделать списки посмотреть более случайным образом, я должен был сделать положение людей в комнате случайным тоже. Так как я решил эту проблему, добавляя действие Чисел, который смешивает Person массивы:

public static void shuffle(Person[] arr) { 
     Random rgen = new Random(); 
     for (int i = 0; i < arr.length; i++) { 
      int randPos = rgen.nextInt(arr.length); 
      Person tmp = arr[i]; 
      arr[i] = arr[randPos]; 
      arr[randPos] = tmp; 
     } 
    } 

TL; DR сгенерированные списки номеров были случайными - но так как порядок людей, которые получили сданных в номерах WASN» t случайные результаты не выглядели очень случайными. Чтобы решить эту проблему, я перетасовал массивы Person.

0

, если вы хотите быть более случайным образом попытаться сделать что-то с Random метод, сделать что-то вроде этого:

Random random = new Random(); 
    for (int i = 0; i < 6; i++) 
    { 
     int roomChoice = random.nextInt(5) + 1; 
     roomChoice += 1; 
    } 

, конечно, это не совсем код, который вы хотите использовать, это всего лишь пример того, как использовать метод Random, изменить его, как вы хотите использовать Это.

Кроме того, почему я сделал random.nextInt(5) + 1; потому, что если random.nextInt(5) + 1; получает вас случайное число от 0 to 5, так что если вы хотите, число от 1 to 6 вы должны добавить 1, говорит само за себя.


На другой ноте, чтобы получить «поистине» случайное не так просто, как кажется, когда вы генерировать «случайное» число будет использовать то, что называется Pseudo random number generation, это, в основном эти программы производят бесконечные строки однозначные числа, обычно в базе 10, называемые десятичной системой. Когда берутся большие образцы псевдослучайных чисел, каждая из 10 цифр в наборе {0,1,2,3,4,5,6,7,8,9} встречается с равной частотой, даже если они не являются равномерно распределенных в последовательности.

+0

Нет необходимости хранить экземпляры 'Random()' ... –

+0

Да, я забыл упомянуть (просто возвращался сюда, чтобы добавить это и уже два ответа!), Но rndRoom() действительно использует метод Random в backgroud. Он рисует от 4-6 - эта часть случайна. Это почему-то не случайно по какой-то причине ... – RoiB

+0

@RoiB Если вы используете метод «Случайный», то причина, по которой ваша программа не кажется очень случайной, заключается в том, что вы получаете от 4 до 6, что два номера, дающие вам 50% шанс получить либо, что после времени не кажется таким случайным. Кроме того, как люди воспринимают вещи, многие вещи не кажутся случайными, так как наши мозги пытаются искать шаблоны практически во всем. – asdfasdfadsf

0

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

http://pastebin.com/u8sZRxi6

+0

Да, должно быть. Это первый раз, когда я задал вопрос, поэтому не был уверен, сколько кода я должен публиковать, публикация всего может быть ошеломляющим, но, с другой стороны, если я не сделаю этого, люди могут пропустить важные бит. В любом случае спасибо за ваш код! Интересно видеть немного другую (возможно лучшую) реализацию, чем то, что я сделал. Я постараюсь как можно больше узнать об этом. – RoiB

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