gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:23:19 26 4
gpt4 key购买 nike

嗯,我正在使用隐写术,并寻找一种方法来通过关键字获取图像中没有随机值的不同像素,所以我想知道是否有任何方法或算法可以通过 key 。

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);
}
}
}

关于java - 如何生成唯一的数字序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32502635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com