【发布时间】:2016-04-18 19:12:40
【问题描述】:
假设我有一个任意固定长度的数组,即它可以是 3、5、7 ... 最多 30。
我如何生成一个算法,如果我每天从数组中选择一个项目,它不应该在任何连续两天选择相同的项目索引。
注意:我没有能力存储前一天采摘的东西。
例如, 如果我的数组是 ["a", "b", "c", "d", "e", "f"]
有效的结果是
["a", "b", "c", "d", "e", "f", "d", "a", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f"]
无效的结果是
["a", "b", "c", "d", "e", "f", "a", "b", "b", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f"]
注意上面连续的b
理想的结果是:在达到长度结束后整个数组完全旋转。
["a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f"]
【问题讨论】:
-
如果您希望它一整天都给您相同的结果,而与调用它的频率无关,那么我建议使用月份中的某天作为某种索引器。将其归结为适合您的数组,默认情况下您将获得每日唯一且递增的结果。
-
您可以访问天数吗?您可以使用天数取模数组中的元素数作为要选取的元素的索引。否则,您可以将选取的元素与索引
0处的元素交换,并始终从范围[1, n - 1]中选取元素,这样您就永远不会选取位置 0 上的前一个元素 -
所以你想要一个(伪)随机序列并且它本身没有索引。正确的?每天选择一个(且相同的)索引。这个序列应该持续多长时间(多少天/月/年)?你必须能够从过去中挑选价值吗?
-
对不起,没有看到完美旋转的部分。最简单的解决方案:
arr[ Math.floor(Date.now()/86400000) % arr.length ]
标签: javascript arrays algorithm