|
本帖最后由 jackyspy 于 2017-3-7 12:02 编辑
转换为从1~19中选2个数的组合,共计19*18/2组。
- import random
- import itertools
- def get_combination(n, m):
- return random.sample(list(itertools.combinations(range(1, n + 1), 2)), m)
- for a, sum_ in get_combination(19, 50):
- print(a, '+', sum_ - a)
- for a, sum_ in get_combination(19, 50):
- print(sum_, '-', a)
复制代码
上面的方案因为构造了所有组合,在数量较小的情况下效率很高。但是当数字范围增加到一定程度时,再构造所有组合就存在很大开销。比如构造1000个10000以内的加减法。对于这种情况,只要从1~9999中随机抽取两个不同的数,大的作和就行了。
- import random
- def get_combination(n, m):
- result = []
- for i in random.sample(range(n * (n - 1)), m):
- x, y = divmod(i, n)
- result.append((x + 1, y + 1) if x < y else (y + 1, x + 2))
- return result
- for a, sum_ in get_combination(19, 50):
- print(a, '+', sum_ - a)
- for a, sum_ in get_combination(19, 50):
- print(sum_, '-', a)
复制代码
|
|