def flip(x, p = p, q = q, m = m): if rng.flip(p, q): y = m[rng.random() % len(m)] if rng.flip(1, 2): return x + y return x - y return x
def cross(l1, l2, p): """cross(list, list, probability) -> list Take elements from one list until a crossover is made, then take elements from the other list, and so on, with the given probability of a crossover at each position. The initial list is chosen at random from one of the two lists with equal probability. The lists must be the same length.""" l = [0] * len(l1) x = map(None, l1, l2) j = rng.random() % 2 (p, q) = torat(p) for i in xrange(len(l1)): if rng.flip(p, q): j = 1 - j l[i] = x[i][j] return l