, , .
( , , , , , , .)
: , 0-, . , , .
import random
def range_intersection(a, b):
if a.step == b.step == 1:
return range(max(a.start, b.start), min(a.stop, b.stop), 1)
else:
raise NotImplemented
def random_subrange(length, range_):
start = random.randrange(
range_.start,
range_.stop - length * range_.step,
range_.step
)
stop = start + length * range_.step
return range(start, stop, range_.step)
def const_fn(n):
def fn():
return n
return fn
def random_distinct_subranges(num, length, range_):
if not callable(length):
length = const_fn(length)
ranges = []
for n in range(num):
while True:
new_range = random_subrange(length(), range_)
if not any(range_intersection(new_range, r) for r in ranges):
ranges.append(new_range)
break
ranges.sort(key = lambda r: r.start)
return ranges
days = range(1, 366)
periods = random_distinct_subranges(3, lambda:random.randint(5,15), days)
print(periods)
-
[range(78, 92), range(147, 155), range(165, 173)]
from itertools import chain
rand_days = chain(*periods)
print(list(rand_days))
[78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 147, 148, 149, 150, 151, 152, 153, 154, 165, 166, 167, 168, 169, 170, 171, 172]