我正在制作campare排序算法的程序。 我使用了大量的数字。我在创建充满随机数的数组时遇到了性能问题。
有没有办法让它更快?
目前我正在使用:
int[] temp = new int[length];
for(int i = 0; i < temp.length; i++)
{
temp[i] = generator.nextInt(temp.length * 10);
}
,其中
generator = new Random();
答案 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随机而不是真随机,因为真正的随机会绝对会损害你的表现。