код, чтобы решить мозговой тизер "Theatre Row"

49
5

Я читал книгу под названием "Пять проблем, связанных с вероятностью вероятности", которая заполнена множеством черепах, связанных с вероятностью. Я не смог решить одну из проблем и не смог понять решение. Итак, я написал код, чтобы получить лучшее чувство. Вот оригинальная проблема.

The Theatre Row: Восемь элегантных холостяков и семь красивых моделей случаются случайно, чтобы купить однолокальные места в том же 15-местном ряду театра. В среднем, сколько пар соседних мест бронируются для супружеских пар?

И вот мой код, получив среднее число смежных пар из 100 случайных выборок:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <numeric>

using namespace std;

// computes the probability for the "theater row" problem
// in the book fifty challenging probabilty problems.

vector<int> reduce(vector<int>& seats); // This function reduces a sequence to a form
// in which there is no adjacent 0 or 1's.
// *example: reduce(111001)=101*

int main()
{
srand(time(0));
int total=15;
int Num=100;
int count0=0; // number of women
int count1=0; // number of men
vector<int> seats; // vector representing a seat assignment,
// seats.size()=total
vector<int> vpair; // vector that has number of adjacent pairs
// as its element, size.vpair()=Num

for (int i=0; i<Num; ++i) {
count0=count1=0;
while ((count1-count0)!=1) {
count0=count1=0;
seats.clear();
for (int j=0; j<total; ++j) {
int r=rand()%2;
if (r==0)
++count0;
else
++count1;
seats.push_back(r);
}
}

for (int k=0;k<seats.size();++k)
cout<<seats[k];

reduce(seats);

for (int k=0;k<seats.size();++k)
cout<<" "<<seats[k];

vpair.push_back(seats.size()-1); // seats.size()-1 is the number
// of adj pairs.
cout<<endl;
}

double avg=static_cast<double>(accumulate(vpair.begin(),vpair.end(),0))/vpair.size();

cout<<"average pairs: "<<avg<<endl;

return 0;
}

vector<int> reduce(vector<int>& seats)
{
vector<int>::iterator iter = seats.begin();
while (iter!=seats.end()) {
if (iter+1==seats.end())
++iter;
else if (*iter==*(iter+1))
iter=seats.erase(iter);
else
++iter;
}
return seats;
}

Код генерирует случайную последовательность из 0 (представляющих женщин) и 1 (мужчин). Затем он "уменьшает" случайную последовательность, так что нет повторений 0 или 1. Например, если код генерирует случайную последовательность 011100110010011 (которая имеет 7 смежных пар), последовательность сводится к 01010101. В сокращенном формате, чтобы определить количество смежных пар, вам просто нужно получить "размер- 1".

Вот мои вопросы.

Ответ на вопрос (согласно книге) составляет 7,47, в то время как я получаю в среднем около 7 или около того от кода. Кто-нибудь видит, откуда возникло несоответствие?

Иногда мой код кажется довольно неэффективным. Это связано с тем, как я генерирую случайную последовательность? (Как вы можете видеть, чтобы создать случайную последовательность из 8 мужчин и 7 женщин, я продолжаю просить случайную последовательность размером 15, пока у нее не будет 8 мужчин (или "1") и 7 женщин (или "0") Есть ли лучший способ создать случайную последовательность, когда существует ограничение, подобное этому?

Я не настолько разбираюсь в программировании. Буду признателен за любые комментарии. Спасибо за помощь!

спросил(а) 2012-04-20T20:12:00+04:00 7 лет, 10 месяцев назад
1
Решение
84

Эта проблема веселая.

Есть 1307674368000 возможных комбинаций.

Есть 203212800 комбинаций, где одна пара собирается вместе.

Но есть 3048192000 комбинаций, где две пары собираются вместе.

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

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

Важное редактирование (чтение):

Учитывается ли ваш код, если вы получаете более 8 0 или 8 единиц. Смысл в том, что у вас может быть только 8 мужчин и 7 женщин, тогда он должен автоматически чувствовать остальное с оставленными символами.

ответил(а) 2015-01-23T19:24:00+03:00 5 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема