Algorithm 从随机种子生成非重复集,并按索引提取结果

Algorithm 从随机种子生成非重复集,并按索引提取结果,algorithm,random,sequence,Algorithm,Random,Sequence,p、 我将其称为随机,但这是一种基于种子的随机洗牌,其中种子将由PRNG生成,但使用相同的种子,将观察到相同的“随机”分布 我目前正试图找到一种方法来帮助做两件事: 1) 生成非重复序列 这将包含两个参数:Seed;和N。它将生成一个大小为N的序列,由1和N之间的数字填充,不重复 我已经找到了一些很好的方法来做这件事,但大多数方法都被第二件事的可行性难住了 2) 从序列中提取一个条目 这将包含3个参数:SeedN;和I。这用于确定在将使用种子和N生成的序列中,在位置I处出现的值。然而,为了处理我

p、 我将其称为
随机
,但这是一种基于种子的随机洗牌,其中种子将由PRNG生成,但使用相同的种子,将观察到相同的“随机”分布

我目前正试图找到一种方法来帮助做两件事:

1) 生成非重复序列 这将包含两个参数:
Seed
;和
N
。它将生成一个大小为
N
的序列,由
1
N
之间的数字填充,不重复

我已经找到了一些很好的方法来做这件事,但大多数方法都被第二件事的可行性难住了

2) 从序列中提取一个条目 这将包含3个参数:
Seed
<代码>N;和
I
。这用于确定在将使用
种子
N
生成的序列中,在位置
I
处出现的值。然而,为了处理我的想法,它绝对不能使用生成的序列,并选择一个元素

我最初的工作是预先计算序列,然后查询它,但这只在测试用例中起作用,因为
种子的数量和将要使用的
N
的值将创建一个PB级的数据库

据我所知,使用需求2实现需求1的方法将是最理想的方法

i、 e.序列由以下内容生成:

function Generate_Sequence(int S, int N) {
    int[] sequence = new int[N];
    for (int i = 0; i < N; i++) {
        sequence[i] = Extract_From_Sequence(S, N, i);
    }
    return sequence;
}

一种方法是对数字的位位置进行排列。假设N是2的幂(我将在后面讨论一般情况!)。 使用种子S在{1,2,…,log(n)}集合上生成置换\sigma。然后根据\sigma排列I的位以获得I'。换言之,位置∑(x)处的I’位是从位置x处的I位获得的。 该方法的一个问题是其线性(在异或操作下关闭)。为了克服这一点,您可以找到一个gcd(p,N)=1的数字p(即使对于非常大的Ns,这也很容易做到),并使用种子S生成一个随机数(q
现在,N不是2的完全幂的情况。当I’落在[1,N]的范围之外时,问题就出现了。在这种情况下,我们将I的最高有效位返回到它们的初始位置,直到结果值落入所需的范围。这是通过将I'的\sigma(log(n))位更改为log(n)位来实现的,依此类推……

1。)
[1,2,3…n]。random_sort()
您能详细介绍第二种情况吗?我不太明白你想要实现什么。@Lingxi听起来像是一个懒惰的序列(生成器),当N不能放入内存时,如果序列是随机的,那么假设值是多少有关系吗?看起来很有希望
GS = Generate Sequence
ES = Extract from Sequence

for:
 S = 1
 N = 5
 I = 4

GS(S, N) = { 4, 2, 5, 1, 3 }
ES(S, N, I) = 1

let S = 2

GS(S, N) = { 3, 5, 2, 4, 1 }
ES(S, N, I) = 4