Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
REPEAT = 10000
DEBUG = False
CHICKS_CNT = 100
SIMULTANEOUS = True
ONCE = False
# --------------------------
import os
if DEBUG:
def debug(*args):
print(args[0] % args[1:])
else:
def debug(*args):
pass
try:
xrange
except NameError:
xrange = range
def get_rnd_01(length):
if isinstance(os.urandom(1)[0], int):
return (c & 1 for c in os.urandom(length))
return (ord(c) & 1 for c in os.urandom(length))
def it_peck(chicks, simultaneous=SIMULTANEOUS):
if simultaneous:
_pritbuf = list(chicks)
for i, p in enumerate(get_rnd_01(len(chicks))):
if simultaneous:
if _pritbuf[i] <= 0: continue
else:
if chicks[i] <= 0: continue
p = i + (1 if p else -1)
if p < 0: p = len(chicks) - 1
if p >= len(chicks): p = 0
debug(' %6r pecks %r', i, p)
chicks[p] -= 1
for i in xrange(len(chicks)):
if chicks[i] < 0: chicks[i] = 0
def stop_it(chicks):
for i in xrange(len(chicks)-1):
if chicks[i] and chicks[i+1]: return False
return False if chicks[len(chicks)-1] and chicks[0] else True
itn = 0
avg = 0
while itn < REPEAT:
chicks = [1]*CHICKS_CNT
debug('** %r) ...', itn)
while True:
debug(' ** %r) ** iter', itn)
it_peck(chicks)
if ONCE or stop_it(chicks): break
s = sum(chicks)
debug('** %r) = %r', itn, s)
avg += s
itn += 1
avg = float(avg) / REPEAT
print(avg)
import random
#chicken are represented as a [0, 1, 1, 0, ...] list
#0 for pecked, 1 for unpecked
#peck a random neighbor (if and where we can)
def peck(chicken, pecked_can_peck = True):
N = len(chicken)
ch = chicken[:]
for i in range(N):
if not pecked_can_peck and chicken[i] == 0: continue
left, right = i-1, (i+1)%N
who_to_peck = random.choice([left, right])
ch[who_to_peck] = 0
return ch
#check if there are still an opportunity to peck
def unpecked_adjacent_exist(chicken):
for i in range(len(chicken)):
if chicken[i-1] + chicken[i] == 2: return True
return False
#peck one time, return the number of survivors
def pecked_single(N):
chicken = [1]*N
chicken = peck(chicken)
return sum(chicken)
#peck iteratively while we can, then return the number of survivors
def pecked_iterative(N):
chicken = [1]*N
while unpecked_adjacent_exist(chicken):
chicken = peck(chicken, False)
return sum(chicken)
N_chicken = 100 #number of chicken
N_iter = 10000 #number of trials
survivors_single, survivors_iterative = 0, 0
for i in range(N_iter):
survivors_single += pecked_single(N_chicken)
survivors_iterative += pecked_iterative(N_chicken)
#averaged results
print(survivors_single/N_iter, survivors_iterative/N_iter)Function TaskOfHens(iHensCount)
numenator=0;
denominator=1;
N=iHensCount;
i=1;
prev=1;
while N>2 do
prev=prev*N/i;
numenator=numenator+i*prev;
N=N-3; i=i+1;
enddo;
N=iHensCount;
j=(numenator%4);
answer=numenator-j;
while N>2 do
answer=answer/4;
N=N-3;
enddo;
return answer+j/4;
EndFunction
iHensCount=99 Ответ -> 24,75
Считаем кур, пока их не заклевали