您可以使用函数将整数范围映射到相同的整数范围,但有例外,如下所示:import random
def excection(val, exceptions):
''' Maps range of values into
similar range of values with exceptions missing.
Exceptions must be sorted increasingly.
for excample with exceptions=(2, 5) it will map
This: 0, 1, 2, 3, 4, 5, 6
To this: 0, 1, 3, 4, 6, 7, 8
'''
if not exceptions:
return val
for e in exceptions:
if val < e:
return val # value before any exclusion is unchanged
val += 1 # after some exclusion value is larger by one
return val
def randint_with_exceptions(min, max, exceptions):
r = random.randint(min, max - len(exceptions)) # generate random number in range smaller then desired by number of exceptions
return excection(r, exceptions) # and map it to desired, more sparse sequence
for i in range(20): # test possible randoms
print randint_with_exceptions(0, 7, (2, 5)),
from functools import partial
ex_25 = partial(excection, exceptions=(2, 5))
assert ( # unittest sequence transformation
map(ex_25, range(5))
== [0, 1, 3, 4, 6]
)