如何在 Java 中创建特定位大小的随机输出?

How to create a random output of a certain bit size in Java?

我想创建一个随机的字母数字字符串,其 bit 计数 always 的大小为 k。大小 k 将 相对 大(从 128 到 2048 或更大)。我正在阅读 this excellent thread 并尝试使用 RandomSecureRandom class 来解决问题,但无济于事。

更准确地说,结果不一定是字符串,它可以是任何东西,只要它是 random 及其 bit 计数始终为 k。

你检查过http://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.html了吗?

如果你需要 128 位的随机数据,你将需要 Java 中的 16 个字节(因为一个字节是 8 位)所以之后(无耻地从所说的 API 复制):

  SecureRandom random = new SecureRandom();
  byte bytes[] = new byte[16];
  random.nextBytes(bytes);

现在你有一个包含 128 位随机数据​​的数组。对于 2048,它是一个字节 [256];

如果您真的想要特定数量的位数,并且不能满足于字节可以做到的 8 的倍数,请尝试使用具有 SecureRandom

的布尔值
SecureRandom sr = new SecureRandom();
boolean bools[] = new boolean[k];
for(int x = 0; x < bools.length; x++){
 bools[x] = sr.nextBoolean();
}

另一种可能性是 BigInteger 构造函数:BigInteger(int numBits, Random rnd).

根据您需要的随机位的安全性,使用 RandomSecureRandom 作为第二个参数。有多种方法可以将 BigInteger 转换为您想要的任何最终格式。要获取字符串,请使用 BigInteger.toString(2),其中 2 是二进制的基数。