如何生成唯一的数字序列?

How to generate a unique sequence of numbers?

好吧,我正在使用隐写术并寻找一种方法来通过关键字获取图像中没有随机值的不同像素,所以我想知道是否有任何方法或算法可以创建一系列唯一数字通过一把钥匙。

PS:通过相同的关键字我需要检索列表以找出哪些像素已被修改,我正在使用java。

随机数生成器将为给定的种子提供相同的序列。您始终可以添加一个步骤,从中删除序列中的重复数字。

  • 创建一个可以打乱顺序的可迭代对象,如列表。
  • 定义每个元素为一个像素坐标,如(0, 0), (0, 1), (0, 2)等
  • 使用特定种子初始化您的随机数生成器 .
  • 随机播放列表。

将会出现一个随机排列的像素坐标列表。通过按顺序遍历其成员,您将以随机顺序遍历像素,而无需访问同一个像素两次。由于您每次都使用相同的种子初始化 PRNG,因此保证随机顺序相同。

例子

假设您有一张 2x3 的图片。它的像素列表如下所示。

[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2]]

用特定种子洗牌后,它可能看起来像这样。

[[1, 2], [0, 2], [1, 1], [0, 1], [1, 0], [0, 0]]

因此,如果您想修改 3 个像素,则为 [1, 2]、[0, 2] 和 [1, 1]。

代码

从概念上讲,您可以像上面描述的那样用列表的列表来做到这一点。然而,从性能角度来看,最好将整数列表从 0 打乱到 n-1,其中 n 是像素数。您可以通过一除一模运算将这些数字转换为像素坐标。如果你想包括颜色平面,你可以很容易地将它扩展到 3 维。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

class ShufflePixels {
    private static List<Integer> shuffleIntegers(int n, long seed) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            list.add(i);
        }
        Collections.shuffle(list, new Random(seed));
        return list;
    }

    public static void main(String[] args) {
        int height = 2;
        int width = 3;
        long seed = 34758L;

        List<Integer> pixelOrder = shuffleIntegers(height * width, seed);

        for (int pixel : pixelOrder) {
            int x = pixel / width;
            int y = pixel % width;
            System.out.println(x + " " + y);
        }
    }
}