【问题标题】:Predict one random variable from another with same seed用相同的种子从另一个随机变量中预测一个随机变量
【发布时间】:2020-07-17 15:22:06
【问题描述】:

给定相同的种子,是否有可能预测一个输出与另一个不同类型和范围的输出?

例如

np.random.seed(100)

x = np.random.randint(0, 16, 2)

np.random.seed(100)

y = np.random.randint(0, 256)

在此示例中,我将 x 作为 2 元素整数数组,范围为 0-15,y 作为整数标量,范围为 0-255。

我的问题是笼统的,不限于上面的例子,在什么情况下可以预测y给定x?假设观察者知道xxy 的类型和范围,但不知道种子本身。

任何关于可预测性的充分或必要条件的讨论都是有用的。

【问题讨论】:

  • 不知道种子?我不这么认为,伪随机数的意义在于,如果不弄清楚种子,几乎不可能进行预测,但这在很大程度上取决于内部使用的算法。
  • 哦,等一下,您在这两种情况下都只生成一个数字!好的,那么也许,它需要了解 numpy 随机性的内部知识。
  • 如果你不知道种子,你只能得到x的1个数字,那么我认为不可能计算出y,因为这需要猜测种子,鉴于您的上述情况,我认为这是不可能的。
  • 不,但您可以从x[0] 中很好地猜测y。在上面的示例中,y 将是一个值,例如 y % 16 == x[0]。所以给定 1002 的种子,x 将是 [7, 1] 而 y 将是 103,这与 7 mod 16 一致。

标签: python numpy random


【解决方案1】:

如果知道种子,就可以预测任意位置的任意值,因为种子用于构建可重现的伪随机序列。如果您不知道种子,则无法根据之前的值预测值。

如果您有来自同一种子的 2 个序列并且它们是平凡绑定的,您可以从另一个序列预测一个序列,或者至少知道这些值将来自较小的集合。 p>

您的示例包含平凡绑定的序列。两者都是 int 序列,一个 (x) 使用 4 位,一个 (y) 使用 8 位。在同一等级,x = y % 16。这意味着如果您知道 y,则 x 是完全已知的,但如果您知道 x,则每个 y 值都有 16 种可能性(而不是 256 种)。

演示:

np.seed(100)
np.random.randint(0, 256, 3)
-> np.array([8, 24, 67])
np.seed(100)
np.random.randint(0, 16, 3)      # we have y % 16
-> np.array([8, 8, 3])

另一个例子或平凡的绑定序列是当一个仅移动一个常数值时

np.seed(100)
np.random.randint(2, 258, 3)    # we will have y + 2 here...
-> np.array([10, 26, 69])          

来自同一个种子的任何两个序列都会有某种依赖关系,但如果它们的关系不是微不足道的,你将只能通过对伪随机实现的详细了解来了解这种依赖关系......到目前为止就我而言,我没有这方面的知识;-),所以我只能为琐碎的情况说话。

【讨论】:

  • “无法从以前的值中预测值”是加密安全 PRNG 的定义。非 CSPRNG 可以是 much easier to predict。 numpy 的最新版本使用 PCG64,这使得它们比之前默认使用的 Mersenne Twister 更难预测,在这种情况下,您需要 624 个值才能知道序列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多