关于Java:随机性的类型

Types of randomness

Java的股票EDOCX1,0个库包括EDCOX1,0,EDCX1,2,(EDCOX1,3,3)。还有其他的吗?我什么时候用?有时我使用SecureRandom只是为了更好地理解我的简单数字。事实证明,SecureRandom实际上让你选择你的发电机。我应该如何以及何时使用这个?

最后,Java 8提供了EDCOX1×6。我不知道这是什么,但它比以前任何一个都慢得多。我应该如何以及何时使用SecureRandom.getInstanceStrong()?另外,是否因为噪声源耗尽而变慢?


Random是可预测的,您只需要一个生成的数字的小序列,就可以在序列中前后移动。请参阅Java的随机函数的逆函数,以反转序列的例子。

SecureRandom不是。

ThreadLocalRandom试图修正Random不是线程安全的事实。

其他形式的随机数可能有不同的特点-你必须学习随机数的数学,才能在你提到的数字和任何其他算法之间达到平衡。

SecureRandom getInstanceStrong()(注:强)似乎是一个更强大的随机序列,对暴露长序列特别有弹性。

随机性

随机性可以用统计的方法来衡量——我不想在这里详细讨论,有大量的资源可以解释如何做到这一点。

比较容易想到一种生成统计随机序列的算法。但是,如果您只尝试统计的随机性,并期望它是加密数据的好来源,那么您就错了。你最好使用:

1
2
3
4
5
private static int lastRandom = 0;

public static int nextRandom() {
  return ++lastRandom;
}

所生成的序列可能无法通过随机性的统计测试,但它几乎是可预测的。

可预测性

这是一个完全不同的数学问题,远远超出了一个简单的stackoverflow答案。如果您想生成一个根本不可预测的随机数字序列,您也可以使用盖革计数器或类似的不可预测硬件源。看看这里有什么有趣的讨论。

安全性

问题是,一个好的加密序列必须在使其难以复制和不使其无法复制之间找到平衡。一个不可能复制的随机数序列对于加密来说是无用的,因为您将永远无法复制相同的序列来解密。

在不变得不可能的情况下实现难以复制是密码学的梦想。同样有很多资源,但维基百科和往常一样,是一个很好的开端。