随机数生成器,为Java生成整数

时间:2010-10-10 12:37:56

标签: java integer random gaussian exponential-distribution

我想在Java中生成一些随机整数,但这根据一些分布规律。 更具体:

  • 我想为高斯分布生成一些随机整数。我发现只有发生器才能返回高斯分布的双重结果。那是为什么?

  • 我想在指数分布的某些限制之间生成一些随机整数?在这里,我也发现只有返回双倍的发电机。我也没有找到一种方法只在两个限制之间生成一些随机指数数字。

你能帮帮我吗?你知道一个可以做我想做的图书馆吗?我研究了Michael Flanagan的图书馆,小马和阿帕奇的Commons Math,但他们没有我需要的东西。

谢谢!

4 个答案:

答案 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