我正在努力找出做到以下几点的最佳方式:
我有一个值列表: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 ++很好。
谢谢!
答案 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.