【问题标题】:Better performance when generating random array int[]生成随机数组 int[] 时性能更好
【发布时间】:2012-12-02 23:23:28
【问题描述】:

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

有什么方法可以加快速度吗?

目前我正在使用:

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

在哪里

generator = new Random();

【问题讨论】:

  • 您能描述一下您提到的这个性能问题吗? length 的值是多少?
  • 我不确定这是否是你想要的,但你为什么不使用 Math.random() 来获取这些值?
  • 该值从 1 到 100 000 并且需要(对我而言)1 分钟。 36 秒。 644 毫秒。我必须使用从 1 到 1 000 000 的值。那是 1000000!生成随机数。
  • @AntonGarciaDosil That method 在幕后使用了一个记忆的java.util.Random,它会更笨拙,因为它返回一个double
  • 我想我找到了解决方案:xkcd.com/221

标签: java arrays performance


【解决方案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 */
}

【讨论】:

    【解决方案2】:

    你可以尝试通过只计算一次 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 都会有效地为您优化。
    • 我也是这样做的,在大循环上,但主要的地方是随机码。不是长度获取器。
    • 当然是随机的。但既然你使用标准随机,你应该这样做;)
    • 这应该只是一个评论。这是一个很好的观点,但没有解决实际问题。
    【解决方案3】:

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

    非常快的伪随机数生成器。请参阅this page 描述。这个RNG的周期大约是2^160,不像 只要MersenneTwisterRNG,但它更快。

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

      • 随机数组的生成或程序生成。
      猜你喜欢
      • 2013-03-26
      • 2010-09-05
      • 2014-05-21
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多