【问题标题】:How to generate a unique sequence of numbers?如何生成唯一的数字序列?
【发布时间】:2015-12-06 18:50:46
【问题描述】:

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

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

【问题讨论】:

  • 如果您向我们提供有关您正在使用哪种语言的信息,回答您的问题会容易得多。大多数编程语言都有一些内置方法可以从初始种子生成随机数,但不知道你在做什么,我无法给出更具体的答案。
  • 是的,但我使用的是 java。

标签: java unique sequence steganography


【解决方案1】:
  • 创建一个可以随机排列的可迭代对象,例如列表。
  • 将每个元素定义为像素坐标,如(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);
        }
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多