基于时间的轮换

时间:2011-07-18 00:10:07

标签: c++ python algorithm random pseudocode

我正在努力找出做到以下几点的最佳方式:
我有一个值列表: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 /伪代码或C / C ++很好。

谢谢!

1 个答案:

答案 0 :(得分: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)

编辑:根据您在评论中的澄清,以下建议可能会有所帮助。

您要查找的是[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位数集的整数(有关建议,请参阅Best algorithm to count the number of set bits in a 32-bit integer?)。然后根据哪些位设置为1从集合中选择元素。在您的情况下,如果n是元素数,则使用pass N作为2 N 在你的集合中。

这个序列是确定性的,给定时间T(从中可以找到序列中的位置),N个元素和素数P.