对于上下文,我试图为我正在制作的应用程序创建一个随机用户的提要,我希望这是一个不重复的提要(当然,直到您访问每个用户的配置文件为止)。假设我有一些用户,索引从0到X(所以X+1用户,我们忽略了登录的用户)。其中一种方法是创建一个数组,然后应用费舍-耶茨洗牌来获得一个随机排列,然后继续进行这个排列。
不过,我的要求有点不同。我希望在客户端生成一个种子,避免生成这样的数组,所以我从客户端发送的唯一数据就是分页:(offset, limit, seed)。
它的核心是范围[0, X]和[0, X]之间的随机双射映射。从根本上说,这是一个随机排列,但这与存储整个数组的开销有关。如果我有100万条条目,那么只为了达到任意的索引就必须生成这个数组是没有意义的。
本质上,我是否可以在偏移量 (x)、极限 (y)和种子中给出一个函数,使它能够在0和DB_SIZE (0 <= x <= DB_SIZE)之间的唯一整数序列(可以被赋予种子)的随机序列中计算位置为x的整数,然后计算出现在它之后的E 113y<代码>E 214/代码>整数?这应该在O(1)时间和空间内完成,而不需要计算这个序列中x-1整数之前的x。(编辑:这里的限制是索引x之后要检索的元素数,包括在内。因此,如果我想获得接下来的10个用户,我将返回,在传统的分页,在索引x, x + 1, ... , x + 9的项目。现在,这些应该是映射到一个随机的指数序列,[29, 57, 61, 1, 5, 30, 11, 70, 94, 7]说。
有什么办法让我做到这一点吗?
Sidenote:是的,在用户浏览了100个其他用户之后,用户不太可能在一开始就注意到重复,所以理论上我可以确保我有100个唯一的用户,然后在这个用户用完后再生成另外100个用户(其中可能包含前100个用户中的重复,无论以前有多少)。这是我可能不得不依赖的实现,但我想知道这是否有可能实现。
https://stackoverflow.com/questions/68087088
复制相似问题