我正在制作比较排序算法的程序。
我使用了大量数字,但是在创建一个由随机数填充的数组时遇到了性能问题。
有没有任何方法可以使其更快?
目前我正在使用:
int[] temp = new int[length];
for(int i = 0; i < temp.length; i++)
{
temp[i] = generator.nextInt(temp.length * 10);
}
位置
generator = new Random();
我正在制作比较排序算法的程序。
我使用了大量数字,但是在创建一个由随机数填充的数组时遇到了性能问题。
有没有任何方法可以使其更快?
目前我正在使用:
int[] temp = new int[length];
for(int i = 0; i < temp.length; i++)
{
temp[i] = generator.nextInt(temp.length * 10);
}
位置
generator = new Random();
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);
}
如果您想要更快的速度,可以编写自己的随机数生成器,这样虽然不太随机但速度更快。
不幸的是,这是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 */
}
java.util.Random
等其他工具实现了高性能。例如,可以看看XORShiftRNG
:
免责声明:我个人没有使用过这个库,只是在谷歌上搜索到的。非常快的伪随机数生成器。请参阅this page以获取描述。此RNG的周期约为2^160,不如
MersenneTwisterRNG
长,但速度更快。
length
的值是多少? - user142162java.util.Random
,而且它返回的是一个double
,所以会更加笨拙。 - Paul Belloralength
替换为1000000
。运行测试,它只花费了不到0.5秒的时间。我甚至在你的for循环中放置了新的Random()。它肯定需要更长的时间,但是小于3秒。你确定数组创建是瓶颈吗?还是你在386cpu的机器上运行它?(我的笔记本电脑是旧的Thinkpad T60,安装了Archlinux) - Kent