M
M
monotonegative2019-12-03 01:58:41
Python
monotonegative, 2019-12-03 01:58:41

Interesting question from me! How to solve the problem of wrong coins?

Not so long ago, at the entrance test for an internship, I came across the following question:

Condition
There is a set of 100 dishonest coins, the i-th coin has a probability of coming up heads equal to 1/(2i+1), for (i = 1, 2, ... , 100). The results for each coin are independent. You tossed all the coins once, what is the probability that we got an odd number of heads?
Output Format
If the answer is not an integer, write it as a decimal, rounding the answer to 4 decimal places or a full stop (format (-)N,NNNN or (-)N.NNNN).

My solution (with explanations):
import numpy as np

"""     На первом этапе создается массив вероятностей выпадения орла 
    для 100 индивидуальных монет - orels.
"""
orels = []
for i in range (1,101, 1):
    probability = 1/(2*i + 1)
    orels.append(probability)
orels = np.asarray(orels)
"""     Также генерируется массив вероятностей выпадения решек - reshkas.
"""
reshkas = 1 - orels

print(reshkas)

"""     Самое вкусное! 
        Все решение основано на том, что наиболее вероятным НЕЧЕТНЫМ случаем 
    будет выборка с выпадением орла у первой монеты (шанс - 0.(3)) на 99 оставшихся решек.
    Следующий нечетный случай - 3 первых орла на 97 решек, затем 5 первых орлов на 95 решек и т.д.
        Почему я выбрал именно такую последовательность выпадения орлов, а не другую? 
    Да потому, что она наиболее вероятная)) - вероятность выпадения орлов с увеличением i, 
    можно сказать, стремиться к нулю.
        В конечном итоге нужно получит 50 выборок следующего вида:
    Odd_case1 = [О P P P P P...P[100]]
    Odd_case2 = [О O O P P P...P[100]]
    Odd_case3 = [О O O O O P...P[100]]
    ...
    Odd_case50 = [О O ...О[99] Р[100]]
    , где О - орел, Р - решка.

        Чтобы получить такие выборки я итерирую массив решек 'reshkas' с поиндексной 
    заменой i-ой решки на i-го орла из массива 'orels' c шагом 2. 
    В каждом цикле для каждой такой выборки мы  считаем общую вероятность 
    выпадения именно такой комбинации перемножив вероятности всех выпавших монет в выборке. 
        Полученные значения заносятся в новый массив 'oryol_probability', что является 
    массивом вероятностей выпадения i-го числа орлов, где i = 1, 3, 5 ... , 99.
"""

oryol_probability = []
for i in range (1, 100, 2):
    if reshkas[i] > 0:
        reshkas[:i] = orels[:i]
    # print(reshkas) - Unmute, если хотите отследить процесс замены.
    multyplied_coins = np.prod(reshkas)
    oryol_probability = np.append(oryol_probability, [multyplied_coins], axis = 0) 

print('Массив вероятностей выпадения i-го числа орлов:', oryol_probability) 

""" Ответ есть сумма полученных 50 общих вероятностей выборок, в которых наиболее вероятно выпало нечетное количество орлов. 
""" 

odd_orels_probability = np.sum(oryol_probability)
print('Ответ: ', '%.4f' % odd_orels_probability)

My answer:
0.0460

My solution, exactly like the answer, does not claim to be correct. Probably everything is solved somehow differently, mb even without using the code and only a certain amount of knowledge of probability theory is enough. I'd love to hear other versions!

Answer the question

In order to leave comments, you need to log in

2 answer(s)
R
Rsa97, 2019-12-03
@monotonegative

Suppose we tossed n-1 coins and got some number of units (eagles). Throw the next coin (n). If zero (tails) falls out, then the number of units will not change, and the parity will remain the same. If a unit falls out, then the parity will change.
P odd n = P odd n-1 *P 0 n + P even n-1 *P 1 n
P even n = P even n-1 *P 0 n + P odd n-1 * P 1 n
P even n and P odd nform a complete set of options (either even or odd), then P even n + P odd n = 1.
Similarly, P 0 n + P 1 n = 1.
Hence, P odd n = P odd n-1 *(1- P 1 n ) + (1-P odd n-1 )*P 1 n

var Podd = 0;
var Peven = 1;
for (var i = 1; i <= 100; i++) {
  P1 = 1 / (2 * i + 1);
//  P0 = 1 - P1;
//  Po = Podd * P0 + Peven * P1;
//  Peven = Podd * P1 + Peven * P0;
//  Podd = Po;
// Всё, что выше, ужимается в
  Podd = Podd * (1 - P1) + (1 - Podd) * P1;
}
console.log(Podd);
// 0.49751243781094556

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question