生成随机数组int []时性能更好

时间:2012-12-02 23:23:28

标签: java arrays performance

我正在制作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 个答案:

答案 0 :(得分:1)

你可以尝试通过仅计算一次for循环和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);
}

答案 1 :(得分:1)

如果你想要它更快,你可以编写自己的随机数发生器, 随机但不那么快。

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

对于您的申请,这就足够了。对于crypthography没有。

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 */
}

答案 2 :(得分:1)

您可以尝试使用Uncommons Maths库。它宣传各种随机数生成器,与java.util.Random相比,它们实现了高性能。例如,请查看XORShiftRNG

  

非常快的伪随机数发生器。有关,请参阅this page   描述。该RNG的周期约为2 ^ 160,而不是   只要MersenneTwisterRNG,但它更快。

免责声明:我个人对此库没有任何经验,只是发现它正在搜索谷歌。

答案 3 :(得分:1)

我所看到的是你的瓶颈是重复的随机()操作。如果你可以将它减少到更少的随机()操作,你最终会有更快的性能。

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

然后,后续操作将遍历此操作以提取随机数。

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

确保你使用psudo随机而不是真随机,因为真正的随机会绝对会损害你的表现。