import random


def cross(c1, c2, rate=0.7):
    """ Based on rate, either returns a new crossover list of binary strings,
    or a copy of c1.
    Rate determines the chance for crossover, 
    where value of 1.0 would produce crossover every time.
    c1 and c2 expected to be lists of binary strings.
    rate is expected to be between 0.0 and 1.0 """
    output = c1[:]
    max_slice_point = len(list(zip(c1,c2)))-1
    if random.random() <= rate:
        slice_point = random.randint(1, max_slice_point)
        output = c1[:slice_point] + c2[slice_point:]
    return output