Я хотел бы создать список из x случайных целых чисел, выбранных из интервала [0, n [(n обычно намного больше x), в результате чего некоторые числа этот интервал следует игнорировать. Я реализовал, что следующим образом:Python: создать список случайных целых чисел, где пространство состояний ограничено
from random import randint
def createRandomList(n, x, ignore=[]):
myList = []
while len(myList) < x:
tempr = randint(0,n-1)
if tempr not in ignore:
myList.append(tempr)
return myList
Когда я затем вызвать
l = createRandomList(5,2,ignore=[2,3])
я получить, например,
l = [1,4] #2 and 3 should not appear
или
l = [0,1]
или
l = [4,4]
или ...
То есть желаемый результат, однако, там быстрее/более компактный способ сделать это ?
EDIT: Все эти решения работают нормально, поэтому мне пришлось выполнить некоторые сравнения скорости, чтобы решить, какой из них принять. Оказывается - не удивительно, - что генерировать все допустимые значения заранее, а затем выбирать из них, очень неэффективно при больших значениях n, а while-loops легко выигрывают. Поэтому я принял hgwells ответ, так как его версия не только быстрее, чем мой while-loop, но и потребляет меньше памяти.
Большое спасибо за ответы; Я мог бы многому научиться у всех из них!
Если вам не нужен весь список сразу, вы можете использовать генераторы. https://docs.python.org/2/howto/functional.html –
Это может сделать это немного быстрее, если 'ignore' был' set', а не 'list'. – Moshe
@RobertJacobs: Спасибо за предложение, я прочитаю об этом. – Cleb