2011-07-18 4 views
1

Я пытаюсь выяснить, лучший способ сделать следующее:
У меня есть список значений: L
Я хотел бы, чтобы выбрать подмножество этого списка размера N, и получить другое подмножество (если список имеет достаточное количество членов) каждые X минут.
Я хотел бы, чтобы значения выбирались последовательно или случайным образом, пока все значения будут использоваться.Время вращения на основе

К примеру, у меня есть список: [google.com, yahoo.com, gmail.com]
я хотел бы, чтобы выбрать X (2 в этом примере) значения и чередовать эти значения каждый Y (60 сейчас) минут:

минут 0-59 : [google.com, yahoo.com]
минут 60-119: [gmail.com, google.com
минут 120-179: [google.com, yahoo.com]
т.д.

Случайные сбор также хорошо, то есть:
минут 0-59: [google.com, gmail.com]
минут 60-119: [yahoo.com, google.com]

Примечания: Время эпоха должна быть 0, когда пользователь устанавливает вращение вверх, то есть, то точка 0 может быть в любой момент времени. Наконец: я бы предпочел не хранить набор «используемых» значений или что-то в этом роде, если это возможно. я бы хотел, чтобы это было как можно проще.

Случайный выбор на самом деле предпочтительнее последовательного, но и в порядке. Каков наилучший способ сделать это? Python/Pseudo-code или C/C++ в порядке.

Спасибо!

ответ

1

Вы можете использовать стандартный модуль itertools, чтобы помочь:

import itertools 
import random 
import time 

a = ["google.com", "yahoo.com", "gmail.com"] 
combs = list(itertools.combinations(a, 2)) 
random.shuffle(combs) 
for c in combs: 
    print(c) 
    time.sleep(3600) 

EDIT: Исходя из ваших разъяснений в комментариях, следующее предложение может помочь.

То, что вы ищете, представляет собой последовательность целых чисел максимальной длины в пределах диапазона [0, N). Вы можете сгенерировать это в Python, используя что-то вроде:

def modseq(n, p): 
    r = 0 
    for i in range(n): 
     r = (r + p) % n 
     yield r 

Дано целое n и простое число p (который не является фактором n, что делает p больше, чем n гарантирует это), вы получите последовательность все целые числа от 0 до -1 n:

>>> list(modseq(10, 13)) 
[3, 6, 9, 2, 5, 8, 1, 4, 7, 0] 

Оттуда вы можете отфильтровать этот список, чтобы включать только целые числа, которые содержат нужное количество 1 бит (см Best algorithm to count the number of set bits in a 32-bit integer? для предложений). Затем выберите элементы из вашего набора, на основе которых бит равен 1. В вашем случае вы должны использовать проход n как 2 N, если N - количество элементов в вашем наборе.

Эта последовательность детерминирована с учетом времени T (из которого вы можете найти положение в последовательности), числа N элементов и простого P.

+0

Доступ к значениям осуществляется с нескольких разных языков, поэтому это не сработает, если я сам не сохранил результаты комбинации и не повернул их каждые X секунд, что не является самым простым решением. –

+1

Извините, я не понимаю, что вы имеете в виду «доступ с нескольких разных языков». Вы имеете в виду языки программирования * или * разговорные языки? Что означает «доступ»? –

+0

Я имею в виду языки программирования. i.e: L доступен в БД и считывается программой на C++, а другой - в Python. Я бы хотел, чтобы они оба возвращали одно и то же подмножество, учитывая одинаковое время ротации, эпоху и размер подмножества. В настоящее время я планирую использовать только модульную операцию, но надеялся, что у SO будет что-то лучше. –

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