Поворот на основе времени - PullRequest
1 голос
/ 18 июля 2011

Я пытаюсь найти лучший способ сделать следующее:
У меня есть список значений: 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-код или C / C ++ в порядке.

Спасибо!

1 Ответ

1 голос
/ 18 июля 2011

Вы можете использовать стандартный модуль 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)

РЕДАКТИРОВАТЬ: Исходя из ваших разъяснений в комментариях, может помочь следующее предложение.

То, что вы ищете, это максимальная длина последовательности целых чисел в диапазоне [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 до n -1:

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

Оттуда вы можете отфильтровать этот список, включив в него только целые числа, содержащие желаемое количество установленных 1 бит (см. Лучший алгоритм подсчета количества установленных бит в 32-разрядном целом числе? для предложения). Затем выберите элементы из вашего набора в зависимости от того, какие биты установлены в 1. В вашем случае вы должны использовать pass n как 2 N , если N - это количество элементов в вашем наборе.

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

...