6

我正在制作campare排序算法的程序。我正在使用大量数字。我在创建充满随机数的数组时遇到了性能问题。

有没有办法让它更快?

目前我正在使用:

int[] temp = new int[length];      
for(int i = 0; i < temp.length; i++)
{
   temp[i] = generator.nextInt(temp.length * 10);
}

在哪里

generator = new Random();
4

4 回答 4

1

您可以尝试通过仅计算一次 for-loop 和 newtInt 参数的最大值或直接使用您的length变量来加快速度。并且只有一个静态随机生成器。

private static final Random GENERATOR = new Random();   

int[] temp = new int[length];      
int tempLen = length * 10;
for(int i = 0; i < length; i++)
{
   temp[i] = GENERATOR.nextInt(tempLen);
}
于 2012-12-02T23:32:21.730 回答
1

如果您想要更快,您可以编写自己的随机数生成器,它的随机性较小但速度更快。

不幸的是,这是 c 代码,但您可以翻译成 java:取自http://en.wikipedia.org/wiki/Random_number_generation

对于您的应用程序,这就足够了。对于密码学不是。

m_w = <choose-initializer>;    /* must not be zero */
m_z = <choose-initializer>;    /* must not be zero */

uint get_random()
{
    m_z = 36969 * (m_z & 65535) + (m_z >> 16);
    m_w = 18000 * (m_w & 65535) + (m_w >> 16);
    return (m_z << 16) + m_w;  /* 32-bit result */
}
于 2012-12-02T23:36:06.040 回答
1

您可以尝试使用Uncommons Math库。它宣传了各种随机数生成器,这些生成器是为了实现高性能而实现的java.util.Random,除其他外。看看XORShiftRNG例如:

非常快速的伪随机数生成器。有关说明,请参阅此页面。这个RNG的周期大约是2^160,没有the长MersenneTwisterRNG但是比较快。

免责声明:我个人对这个库没有经验,只是在谷歌上找到它。

于 2012-12-02T23:47:18.867 回答
1

我看到的是您的瓶颈是重复的 random() 操作。如果您可以将其减少到更少的 random() 操作,您最终将获得更快的性能。

我会生成一个非常大的字符串、字节数组或数字。这将导致仅创建一个大型初始随机数据。将其视为随后使用的数据池。

随后的操作将只遍历它以提取随机数。

这样,您只生成一次随机数据,从而消除了随机数据生成的瓶颈。

确保您使用 psudo random 而不是真正的随机,因为真正的随机肯定会损害您的性能。

于 2012-12-02T23:55:11.510 回答