我有一个应用程序,需要测量算法消耗了多少位的随机性。我已经通过重写
实现
如何实现更好的
编辑:
以下是我目前的进展:
这可能不完全正确,但本质上它会从
Random.next(int)
方法来增加计数器并调用其父类方法的方式,对Random
子类进行了仪表化。实现
nextInt(int)
方法时遇到了一些问题,因为即使范围是2的幂,它也总是绘制32位。对于其他范围,问题更多:该方法不均匀——仅针对原始值大于小于Integer.MAX_VALUE
最大倍数的范围,重试一次——并且它仍然使用比所需位数更多的随机位。如何实现更好的
nextInt(int)
版本,仅使用确定范围内值所需的最少随机位数,同时完全均匀?它不需要保证终止(无论如何不可能),只需要具有1的概率终止。编辑:
以下是我目前的进展:
int nextInt(int max){
int n = Integer.numberOfTrailingZeros(max);
return next(n) + nextOddInteger(max >> n) << n;
}
这可能不完全正确,但本质上它会从
num
中分解出所有的 n
个数字二,并生成一个具有 n
位的随机数,并将 nextOddInteger(num)
前缀添加到结果中。 nextOddInteger
将生成一个随机整数,该整数最大为其质因数分解不包含数字二。如何以非常高效的随机方式实现这一部分?
Random
类只是一个LCPRNG,例如最基本的类型。在*NIX上,您可以直接从/dev/random
中提取位,但我不建议在跨平台的Java中这样做。 - Richard J. Ross III