Я буду кредитовать @TimPietzcker за то, что указал на меня в направлении этого ответа, хотя я не использовал функцию, которую он предложил (random.sample
).
В этом коде, я выбираю шесть индексов из тех, в list_
(переименован из list
, чтобы избежать перезаписи встроенной) без замены, используя np.random.choice
. Затем я сортирую эти индексы и перебираю по каждой паре соседних индексов, беря в качестве области значения от первого индекса (i
) ко второму (j
) в паре, включительно (отсюда j + 1
).
(Если бы я использовал j
вместо j + 1
, индексы никогда не будет в состоянии включать все значения в списке, из-за отсутствия замены во время фазы отбора. Например, если одна пара была (1, 3)
, минимальная значение первого индекса следующей пары будет 4
, потому что 3
не может быть выбран в два раза. Таким образом, первая пара будет принимать значения с индексами 1
и 2
, а значение в 3
будет пропущен.)
Поскольку j
может быть равен len(list_) - 1
, я включил try
/except
, который улавливает IndexError
, который будет поднят в этом случае и заставляет область включать все значения в конец list_
- эквивалентно принятию значений от i
до j
включительно, как и для всех других случаев.
import numpy as np
list_ = [100,102,108,307,365,421,433,487,511,537,584]
n_regions = 3
indices = sorted(np.random.choice(range(len(list_)), size=n_regions * 2,
replace=False))
list_of_regions = []
for i, j in zip(indices[::2], indices[1::2]):
try:
list_of_regions.append(list_[i:j + 1])
except IndexError:
# j + 1 == len(list_), so leave it off.
list_of_regions.append(list_[i:])
Я немного смущен. Кажется, у вас есть список границ региона и дайте пример, когда некоторые из них были выбраны, но затем скажите, что вы хотите, чтобы «разница между началом и концом региона была случайной между 200 и 1000», что не является в большинстве ваших примеров. Кроме того, вам может потребоваться указать, какую случайность вы волнуете. Различные способы выбора границ могут привести к разным случайным распределениям в результатах. – Blckknght
Вы сказали: «Но это не помогает». Это не помогает? В чем проблема? – GreenAsJade
Похоже, вам нужно всего лишь выбрать 6 элементов из этого списка и отсортировать результат ('sorted (random.sample (mylist, 6))'). Затем у вас есть старт-стоп-последовательность с тремя диапазонами. Правильно? –