生成随机整数数组int[]时如何提高性能

6

我正在制作比较排序算法的程序。

我使用了大量数字,但是在创建一个由随机数填充的数组时遇到了性能问题。

有没有任何方法可以使其更快?

目前我正在使用:

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

位置

generator = new Random();

2
你能描述一下你提到的这个性能问题吗?length的值是多少? - user142162
1
@AntonGarciaDosil 那个方法 在幕后使用了一个记忆化的 java.util.Random,而且它返回的是一个 double,所以会更加笨拙。 - Paul Bellora
2
我认为我找到了解决方案:http://xkcd.com/221/ - Paul Bellora
@Gh61 我把你的代码复制到了一个JUnit测试类中,将length替换为1000000。运行测试,它只花费了不到0.5秒的时间。我甚至在你的for循环中放置了新的Random()。它肯定需要更长的时间,但是小于3秒。你确定数组创建是瓶颈吗?还是你在386cpu的机器上运行它?(我的笔记本电脑是旧的Thinkpad T60,安装了Archlinux) - Kent
@Gh61 哦,抱歉,你是指1000000!...我没有将“!”视为数学符号。 :( - Kent
显示剩余11条评论
4个回答

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);
}

我点了赞,但我怀疑任何现代JVM都会为您有效地进行优化。 - Jim Blackler
我也是这样做的,在大循环中,但主要问题在于随机代码,而不是长度获取器。 - AlexWien
当然是随机的,但由于你使用了标准随机函数,所以应该像这样做 ;) - sailingthoms
这应该只是一条注释。这是一个好观点,但并没有回答实际问题。 - Paul Bellora

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

1
你可以尝试使用Uncommons Maths库。它提供了各种随机数生成器,相对于java.util.Random等其他工具实现了高性能。例如,可以看看XORShiftRNG

非常快的伪随机数生成器。请参阅this page以获取描述。此RNG的周期约为2^160,不如MersenneTwisterRNG长,但速度更快。

免责声明:我个人没有使用过这个库,只是在谷歌上搜索到的。

1
我看到的是,您的瓶颈在于重复的random()操作。如果您能将其减少到较少的random()操作,最终就会有更快的性能。
我建议首先生成一个非常大的字符串、字节数组或数字。这将导致只有一次大量的初始随机数据创建。可以将其视为随后要处理的数据池。
随后的操作将只需通过迭代来提取随机数。
这样,您只需生成一次随机数据,从而消除了随机数据生成的瓶颈。
请确保使用伪随机而不是真随机,因为真随机肯定会影响性能。

生成随机数组是过程性的。 - ransom bot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接