5

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

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

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

你能帮助我吗?你知道可以做我想做的事的图书馆吗?我研究了 Michael Flanagan 的图书馆、colt 和 apache 的 Commons Math,但他们没有我需要的东西。

谢谢!

4

4 回答 4

3

我建议你使用Uncommons Math库,它包含不同的随机生成器(例如 Mersenne Twister,基于 AES)和分布(泊松、高斯等)

至于“双重问题”:几乎所有随机生成器都会生成双重,因为它们是最常用的。如果您需要整数,则需要自己进行舍入(调用Math.round就足够了)。假设您正在生成具有厘米精度的随机人身高:如果您的随机生成器返回 175.234,您可以将其四舍五入为 175。这真的不是问题。

至于指数分布的限制:没有生成器可以让您选择限制,因为指数分布不存在这样的限制。指数分布通常模拟泊松过程中两个连续事件之间的延迟:延迟可以低至 0,也可以非常高。极高的结果确实不太可能,但并非不可能。您可以通过从生成器获取随机数、添加下限并使用Math.max修剪它(如果它高于您的上限)来解决问题。但这不再是指数分布。

于 2010-10-10T13:11:20.160 回答
2

如果您有一个从 0 到 1 的双精度数,则可以将其缩放为整数:

int res = lowLimit + (int)(myRandFunction() * (highLimit - lowLimit));

编辑:

为什么我投了反对票?他很伤心,他有一个函数可以返回他想要的双精度分布(我猜是 0 到 1 的双精度形式),所以这可以完成这项工作。

于 2010-10-10T12:45:16.567 回答
-1

只需生成一个 double 并将其缩放到您需要的整数范围。例如,如果常规(统一)随机数生成器生成 0.0 到 1.0 之间的数字,而您想要 0 到 100 之间的数字,则只需将生成的随机数乘以 100。

于 2010-10-10T12:40:28.990 回答
-1

boost 有一些非常好的随机数生成器,我知道它的 c++ 而不是 java,但是实现应该是自己实现它们的一个很好的指南。

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_random.html

于 2010-10-10T12:47:27.183 回答