【发布时间】:2011-01-05 18:19:19
【问题描述】:
我需要一个函数来生成随机整数。 (暂时假设 Java 类型为 long,但稍后将扩展为 BigInteger 或 BitSet。)
棘手的部分是有一个参数 P 指定结果中任何位的(独立)概率为 1。
如果 P = 0.5,那么我们可以使用标准随机数生成器。 P 的其他一些值也很容易实现。这是一个不完整的例子:
Random random = new Random();
// ...
long nextLong(float p) {
if (p == 0.0f) return 0L;
else if (p == 1.0f) return -1L;
else if (p == 0.5f) return random.nextLong();
else if (p == 0.25f) return nextLong(0.5f) & nextLong(0.5f);
else if (p == 0.75f) return nextLong(0.5f) | nextLong(0.5f);
else if (p == 0.375f) return nextLong(0.5f) & nextLong(0.75f); // etc
else {
// What goes here??
String message = String.format("P=%f not implemented yet!", p);
throw new IllegalArgumentException(message);
}
}
对于介于 0.0 和 1.0 之间的任何 P 值,有没有办法对此进行概括?
【问题讨论】:
-
出于好奇,您是否测试过接受的答案是否有效?需要多少次迭代才能可接受地接近给定的概率?性能还不够吗?
-
是的,我将其限制为 16 次迭代(1 次迭代 == 1 位精度),它在我的(相当旧的)PC 上每秒生成大约 1700 万位。我用非理性概率(例如 0.1*PI)测量了这个,但是对于整数来说它要快得多,例如p=0.75 时为 120Mbits/秒。
-
有什么特别的理由可以避免移位和乘法吗?
-
@Svante,没有。我的第一次尝试太慢了,我认为这是因为位移/乘法,但实际上只是我生成了太多随机数(通过为每个输出位单独滚动。)
标签: java optimization random bit-manipulation