2016-09-16 10 views
0

. Я могу использовать это, чтобы найти все возможные варианты, однако я хочу, чтобы случайный образец 1000 из этот набор:Какой код я могу использовать, если у меня есть десять чисел, и я хочу произвести 1000 различных случайных перетасованных порядков из десяти чисел.

items = range(1,11) 
//from itertools import permutations 
//for p in permutations(items): 
print(p) 
+0

['random.sample'] (https://docs.python.org/library/random.html#random.sample) – metatoaster

+0

Почему вы используете и помечены перестановками? Перестановки не случайны. Что они должны делать со случайной выборкой? – TigerhawkT3

+0

Я предполагаю, что он хотел получить 1000 случайных выборок из этого списка перестановок. – metatoaster

ответ

0

Предлагаемое решение. Исходя из ваших требований, список из 10 номеров уже выбран, и вы просто хотите иметь список, который будет содержать эти 10 номеров, перетасованных 1000 уникальными способами. Итак, ниже, у меня есть список из 10 чисел. Random.sample (num_list, 10) выберет эти 10 чисел наугад и создаст новый список. Поскольку список имеет только 10 номеров, он выбирает все 10 в случайном порядке и создает новый список. Он проверяет общий список ответов, чтобы узнать, был ли этот заказ выбран ранее. Если это не так, оно добавляет его в список. Это не было найдено это до 1000 уникальных заказов:

import random 
num_list = [6, 9, 1000, 53, 321, 8, -5, 714, 0, 2120] 
answer_list = [] 
while len(answer_list) != 1000: 
    new_sample = random.sample(num_list, 10) 
    if new_sample not in answer_list: 
     answer_list.append(new_sample) 

Таким образом, после запуска сценария здесь последние 5 пунктов в списке и первые 5 пунктов в списке:

==== RESTART: C:/Users/Joe/Desktop/scripts/Stack_overflow/ransom.py ==== 
>>> answer_list[-5:] 
[[0, 9, 8, 53, 321, 1000, -5, 6, 2120, 714], 
[714, 0, 2120, 6, -5, 53, 8, 321, 9, 1000], 
[6, -5, 53, 321, 0, 1000, 2120, 8, 9, 714], 
[321, 53, 9, 8, 2120, 714, 0, 1000, -5, 6], 
[1000, 53, 2120, 6, 8, 9, -5, 714, 321, 0]] 
>>> answer_list[:5] 
[[321, 9, 714, -5, 53, 6, 1000, 8, 0, 2120], 
[0, 6, 2120, -5, 714, 9, 1000, 8, 53, 321], 
[1000, 8, 9, 6, 53, 321, 2120, 714, 0, -5], 
[9, 0, 321, 6, 714, 53, 1000, 2120, -5, 8], 
[6, 1000, 321, 0, -5, 2120, 8, 714, 9, 53]] 
>>> 
0

Поскольку set гарантирует уникальность его элементов, вы можете произвести перестановки через random.sample() и попытаться прибавление результата пока размер набора не получает до требуемого количества:

import random 

a = range(1,11) 
solutions = set() 
while len(solutions) < 1000: 
    solutions.add(tuple(random.sample(a, 10))) 

На данный момент solutions содержит набор кортежей, которые являются уникальными перестановками. Вариация на тему использует перетасовки вместо выборки:

import random 

a = list(range(1,11)) 
solutions = set() 
while len(solutions) < 1000: 
    random.shuffle(a) 
    solutions.add(tuple(a)) 

Если вы хотите, список списков, а не множество кортежей, добавьте следующее после while цикла:

lols = [list(x) for x in solutions] 

Учитывая, что вы хочу 1000 из 10! (что является 3628800) перестановками, риск столкновений близок к нулю. Ожидаемое количество итераций цикла равно 1000 плюс небольшая доля, менее 1001.

+1

Будет ли downvoter объяснять, что вы считаете неправильным здесь? – pjs

0

К сожалению, модуль перестановок Python обеспечивает только итерацию с помощью перестановок на 3 миллиона плюс не выбор одного произвольно по заказу. Вам нужно что-то вроде этого:

def kthperm(S, k): 
    P = [] 
    while S != []: 
     f = math.factorial(len(S)-1) 
     i = int(math.floor(k/f)) 
     x = S[i] 
     k = k%f 
     P.append(x) 
     S = S[:i] + S[i+1:] 
    return P 

Теперь вы можете выбрать случайное число от 0 до 10 -1, вычислить эту перестановку, и добавить его в свой список, столько раз, сколько необходимо:

perms = [] 
for i in range(1000): 
    perms.append(kthperm(list(range(1,11)), 
     random.randint(0,math.factorial(10)-1)) 

 Смежные вопросы

  • Нет связанных вопросов^_^