我想在Java中生成一些随机整数,但这根据一些分布规律。 更具体:
我想为高斯分布生成一些随机整数。我发现只有发生器才能返回高斯分布的双重结果。那是为什么?
我想在指数分布的某些限制之间生成一些随机整数?在这里,我也发现只有返回双倍的发电机。我也没有找到一种方法只在两个限制之间生成一些随机指数数字。
谢谢!
答案 0 :(得分:3)
我建议您使用Uncommons Maths库,它包含不同的随机生成器(例如Mersenne Twister,基于AES)和分布(泊松,高斯等)
至于“双重问题”:几乎所有随机生成器都生成双倍,因为它们是最常用的。如果你需要整数,你需要自己进行舍入(调用Math.round就足够了)。假设您以厘米精度生成随机人物高度:如果您的随机生成器返回175.234,您可以将其舍入为175.这真的不是问题。
至于指数分布的限制:没有允许您选择限制的生成器,因为指数分布不存在这样的限制。指数分布通常模拟泊松过程中两个连续事件之间的延迟:延迟可以低至0,或者可以非常高。极高的结果真的不太可能,但它们并非不可能。您可以通过从生成器中获取一个随机数来解决问题,添加下限并使用Math.max修剪它,如果它高于您的上限。但这不再是指数分布。
答案 1 :(得分:2)
如果您有一个从0到1的双精度数,则可以将其缩放为整数:
int res = lowLimit +(int)(myRandFunction()*(highLimit - lowLimit));
修改强>
为什么我投了票?他很遗憾他有一个函数可以返回他想要的分布的双倍(我猜到了一个0到1的双重形式),所以这就可以完成这项工作。
答案 2 :(得分:-1)
只需生成一个double并将其缩放到您需要的整数范围。例如,如果常规(统一)随机数生成器生成从0.0到1.0的数字,并且您希望数字从0到100,则只需将生成的随机数乘以100即可。
答案 3 :(得分:-1)
boost有一些非常好的随机数生成器,我知道它的c ++而不是java,但实现应该是自己实现它们的一个很好的指南。
http://www.boost.org/doc/libs/1_43_0/doc/html/boost_random.html