15.09.2008, 17:10 | #41 |
Участник
|
http://www.codeplex.com/IronPython
X++: import operator def permutationStep(xs, i): rests = permutations(xs[:i] + xs[i+1:]) return map(lambda x:[xs[i]] + x, rests) def sumLists(lists): return reduce(operator.add, lists, []) def permutations(xs): if xs == []: return [[]] return sumLists(map(lambda x: permutationStep(xs, x), range(len(xs)) )) print permutations([1, 2]) print permutations([1, 2, 3]) [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] Только так не честно, наверное |
|
15.09.2008, 17:13 | #42 |
MCTS
|
|
|
15.09.2008, 17:14 | #43 |
Участник
|
да, я ошибся
|
|
15.09.2008, 17:18 | #44 |
MCTS
|
Цитата:
Сообщение от belugin
http://www.codeplex.com/IronPython
X++: import operator def permutationStep(xs, i): rests = permutations(xs[:i] + xs[i+1:]) return map(lambda x:[xs[i]] + x, rests) def sumLists(lists): return reduce(operator.add, lists, []) def permutations(xs): if xs == []: return [[]] return sumLists(map(lambda x: permutationStep(xs, x), range(len(xs)) )) print permutations([1, 2]) print permutations([1, 2, 3]) [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] Только так не честно, наверное |
|
15.09.2008, 17:26 | #45 |
Участник
|
Доказал, с помощью мат.индукции:
общая формуля для n получилась: 1/n + 1/2 * 1/n * (n-2) |
|
15.09.2008, 17:27 | #46 |
MCTS
|
|
|
15.09.2008, 17:30 | #47 |
Участник
|
|
|
15.09.2008, 17:34 | #48 |
Участник
|
Я просто задачу решал мат.индукцией. Не знаю, или это правильный подход
Решил для n = 2, увидел, что вероятность равна 1/2. Решил для n = 3, увидел, что вероятность равна 1/2. Решил для n = 4, увидел, что вероятность равна 1/2 и смог предположить формулу (приведена выше). Осталось только доказать, что формула сводится к 1/2 для этого случая и для случая n+1, что я и проделал Заумно правда как-то получилось |
|
15.09.2008, 17:46 | #49 |
MCTS
|
Круто!
У меня доказательство попроще, используя логику. Это конечно не так солидно, как мат. индукция, но все же... Для любого пассажира, начиная с первого, существует два результата, 100% определяющих решение задачи. Если очередной пассажир занимает место №1, то последний пассажир 100% занимает свое место, так как все последующие пассажиры рассаживаются по своим местам. Если пассажир занимает место №71, то последний пассажир 100% пролетает со своим местом. Занятие пассажиром любого другого места не влияет на итоговый результат. Можно, конечно, заморочиться с расчетом отдельных вероятностей для каждого пассажира занять определенное место, однако очевидно, что вероятность занять первое место для любого пассажира равна вероятности занять последнее место. Именно из равности этих вероятностей итоговая вероятность получается 1/2. |
|
|
За это сообщение автора поблагодарили: belugin (5). |
15.09.2008, 17:58 | #50 |
MCTS
|
Для полного самоутверждения осталось написать маленькую программку .
|
|
15.09.2008, 18:02 | #51 |
Участник
|
Не, программку не осилил.
Вот есть вариант, авторство не мое (код на С++): X++: #include <algorithm> #include <iostream> using namespace std; int A[20]; int n = 4; int main() { int nf = 1; int i,j; for(i = 2; i <= n; ++i) nf *= i; for(i = 0; i < n; ++i) A[i] = i + 1; for(i = 0; i < nf; ++i) { for(j = 0; j < n; ++j) cout<<A[j]; cout<<endl; int jp = 0; for(j = 0; j < n - 1; ++j) if (A[j] < A[j+1]) jp = j; int tp = 0; for(j = n - 1; j >= 0; --j) if (A[j] > A[jp]) { tp = j; break; } swap(A[jp], A[tp]); for(j = 0; j < (n - jp) / 2; ++j) swap(A[jp + 1 + j], A[n - 1 - j]); } } |
|
15.09.2008, 18:07 | #52 |
Участник
|
Хм. Я не совсем понял как у вас получилось 1/2?
Я рассуждал таким образом что если даже первый пассажир самовольно занимает любое место, то остальные пассажиры занимают места по возможности согласно билету, следовательно единственный пассажир который займет не своё место это тот, чьё место займёт первый пассажир. Следовательно последний не займет своё место только в одном случае из 71. Где я не прав?
__________________
С уважением, Dozer |
|
15.09.2008, 18:13 | #53 |
Участник
|
"следовательно единственный пассажир который займет не своё место это тот, чьё место займёт первый пассажир."
если это второй пассажир, то куда он денется? |
|
15.09.2008, 18:24 | #54 |
MCTS
|
первый "случайно" занимает место второго, второй "случайно" занимает место третьего, третий - четвертого и т.д.
|
|
15.09.2008, 18:34 | #55 |
Участник
|
Ну вот тут как раз видимо и расхождение. Согласно условию "пацан" только первый пассажир, и я предполагал что остальные будут стараться занять своё место если это возможно.
__________________
С уважением, Dozer |
|
15.09.2008, 18:35 | #56 |
Участник
|
Он сядет на первое место - место первого пассажира.
__________________
С уважением, Dozer |
|
15.09.2008, 18:40 | #57 |
MCTS
|
Цитата:
Сообщение от CDR
Чувак в автобусе.
На остановке в ожидании 71-местного автобуса стоит 71 пассажир. У каждого из пассажиров есть билетик с номером места, которое ему необходимо занять при посадке в автобус. Для простоты пусть номер пассажира в очереди равен номеру его места в автобусе (1-ый чел должен занять место №1, 2-ой - №2, ... 71-ый - место №71 ). Однако первый стоящий в очереди пассажир - чувак, и при посадке в автобус он плюхается в кресло, которое ему понравилось больше всего (случайным образом от 1 до 71). Какова вероятность того, что последний (71-ый) пассажир займет свое (71-ое) место? UPDATED: Упустил предложение, что каждый последующий пассажир, после первого, садится на свое место, если оно не занято, в противном случае ему достается случайное место из свободных. |
|
15.09.2008, 18:43 | #58 |
MCTS
|
Цитата:
Сообщение от kashperuk
Не, программку не осилил.
Вот есть вариант, авторство не мое (код на С++): X++: #include <algorithm> #include <iostream> using namespace std; int A[20]; int n = 4; int main() { int nf = 1; int i,j; for(i = 2; i <= n; ++i) nf *= i; for(i = 0; i < n; ++i) A[i] = i + 1; for(i = 0; i < nf; ++i) { for(j = 0; j < n; ++j) cout<<A[j]; cout<<endl; int jp = 0; for(j = 0; j < n - 1; ++j) if (A[j] < A[j+1]) jp = j; int tp = 0; for(j = n - 1; j >= 0; --j) if (A[j] > A[jp]) { tp = j; break; } swap(A[jp], A[tp]); for(j = 0; j < (n - jp) / 2; ++j) swap(A[jp + 1 + j], A[n - 1 - j]); } } X++: static void Google(Args _args) { int A[20]; int n = 4; int nf = 1; int i,j; int jp = 0; str line; int tp = 0; anyType buffer; ; // Расчет факториала (количество возможных значений) for (i = 2; i <= n; i++) nf = nf * i; // Генерация массива for(i = 1; i <= n; i++) A[i] = i; // перебор всех возможных значений for(i = 1; i <= nf; i++) { line = ''; for (j = 1; j <= n; j++ ) { line = line + int2str(A[j]); } info(line); jp = 1; for(j = 1; j <= (n - 1); j++) { if (A[j] < A[j+1]) jp = j; } tp = 1; for(j = n; j >= 1; j--) { if (A[j] > A[jp]) { tp = j; break; } } // swap buffer = A[jp]; A[jp] = A[tp]; A[tp] = buffer; for(j = 1; j <= ( (n - jp)/2 ); j++) { // swap buffer = A[jp + 1 + j]; A[jp + 1 + j] = A[n - 1 - j]; A[n - 1 - j] = buffer; } } } |
|
15.09.2008, 22:44 | #59 |
Участник
|
Цитата:
Сообщение от CDR
Хм.. вот вроде бы эквивалент на X++
X++: static void Google(Args _args) { int A[20]; int n = 4; int nf = 1; int i,j; int jp = 0; str line; int tp = 0; anyType buffer; ; // Расчет факториала (количество возможных значений) for (i = 2; i <= n; i++) nf = nf * i; // Генерация массива for(i = 1; i <= n; i++) A[i] = i; // перебор всех возможных значений for(i = 1; i <= nf; i++) { line = ''; for (j = 1; j <= n; j++ ) { line = line + int2str(A[j]); } info(line); jp = 1; for(j = 1; j <= (n - 1); j++) { if (A[j] < A[j+1]) jp = j; } tp = 1; for(j = n; j >= 1; j--) { if (A[j] > A[jp]) { tp = j; break; } } // swap buffer = A[jp]; A[jp] = A[tp]; A[tp] = buffer; for(j = 1; j <= ( (n - jp)/2 ); j++) { // swap buffer = A[jp + 1 + j]; A[jp + 1 + j] = A[n - 1 - j]; A[n - 1 - j] = buffer; } } } |
|
16.09.2008, 08:06 | #60 |
Пенсионер
|
Цитата:
Сообщение от CDR
Круто!
У меня доказательство попроще, используя логику. Это конечно не так солидно, как мат. индукция, но все же... Для любого пассажира, начиная с первого, существует два результата, 100% определяющих решение задачи. Если очередной пассажир занимает место №1, то последний пассажир 100% занимает свое место, так как все последующие пассажиры рассаживаются по своим местам. Если пассажир занимает место №71, то последний пассажир 100% пролетает со своим местом. Занятие пассажиром любого другого места не влияет на итоговый результат. Можно, конечно, заморочиться с расчетом отдельных вероятностей для каждого пассажира занять определенное место, однако очевидно, что вероятность занять первое место для любого пассажира равна вероятности занять последнее место. Именно из равности этих вероятностей итоговая вероятность получается 1/2. "Какова вероятность того что Вы встретите на улицах города динозавра? Ответ: 1/2 Либо встречу, либо нет!" (с) Соответственно пассажир номер n (в данной задаче это 71 просто уловка ИМХО) либо сядет на свое место либо нет!
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
|
За это сообщение автора поблагодарили: ikopyl (1). |