基于时间的旋转

Time based rotation

本文关键字:旋转 时间 于时间      更新时间:2023-10-16

我正在尝试找出做以下事情的最佳方法:
我有一个值列表: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++都可以。

谢谢!

您可以使用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的元素。在您的情况下,如果N是您的集合中的元素数量,您将使用传递n作为2N

给定时间T(从中可以找到序列中的位置)、N个数元素和素数p,该序列是确定的。