/
flip-biased.py
70 lines (61 loc) · 2.73 KB
/
flip-biased.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
''' άσκηση από το http://pythonies.mysch.gr/chapters/guess.pdf
Εδώ θα προστεθεί η εκφώνηση (όταν παγιωθεί) ώστε το πρόγραμμα
να είναι αυτοτελές.
'''
import random
def flipBiased(p):
''' Μεροληπτικό νόμισμα: επιστρέφει 0 με πιθανότητα p%
και 1 με πιθανότητα (100-p)%.
'''
if random.randint(1,100) <= p:
return 0
else:
return 1
def flipFair(p):
''' Δίκαιο νόμισμα με τη μέθοδο von Neumann: επιστρέφει
0 ή 1 με πιθανότητα 50% το καθένα, χρησιμοποιώντας
ένα μεροληπτικό νόμισμα με ποσοστό μεροληψίας p.
'''
# πρώτη ρίψη των δύο νομισμάτων
coin1 = flipBiased(p)
coin2 = flipBiased(p)
# όσο η ένδειξη των δύο νομισμάτων είναι ίδια
# τα δύο νομίσματα ξαναρίχνονται
while coin1 == coin2:
coin1 = flipBiased(p)
coin2 = flipBiased(p)
# επιστρέφεται η ένδειξη του πρώτου ζαριού
# ως αποτέλεσμα του δίκαιου νομίσματος
return coin1
# το ποσοσό μεροληψίας και το πλήθος επαναλήψεων
# επιλέγονται από το χρήστη
print("Δώσε ποσοστό μεροληψίας p:", end = " ")
bias = int(input())
print("Δώσε πλήθος ρίψεων:", end = " ")
n = int(input())
# έλεγχος της flipBiased
print("Γίνεται προσομοίωση με", n, "ρίψεις του μεροληπτικού νομίσματος.")
i = 0
zeros = 0
while i < n:
# αν το αποτέλεσμα της ρίψης είναι 0
# αυξάνεται ο μετρητής zeros
if flipBiased(bias) == 0:
zeros = zeros + 1
i = i + 1
# αποτέλεσμα ελέγχου
print("Ποσοστό μεροληψίας:", bias)
print("Ποσοστό μεροληψίας από προσομοίωση:", zeros*100/n)
# έλεγχος της flipFair
print("\nΓίνεται προσομοίωση με", n, "ρίψεις του δίκαιου νομίσματος.")
i = 0
zeros = 0
while i < n:
# αν το αποτέλεσμα της ρίψης είναι 0
# αυξάνεται ο μετρητής zeros
if flipFair(bias) == 0:
zeros = zeros + 1
i = i + 1
# αποτέλεσμα ελέγχου
print("Αναμενόμενο ποσοστό μεροληψίας: 50")
print("Ποσοστό μεροληψίας δίκαιου νομίσματος από προσομοίωση:", zeros*100/n)