这种方法比Math.random()更快吗?

时间:2011-03-13 20:53:58

标签: java android optimization math random

我是初学者,目前已开始使用粒子群优化算法开发Android游戏。我现在正在尝试优化我的代码,我在for循环中有很多Math.random(),它几乎一直在运行。所以我想到了一种绕过并跳过所有Math.random()调用的方法。

使用这样的方法:

    float random[] = new float[100];
static int randomIndex=0;

private float myRandom(){
    if(randomIndex >= 99)
        randomIndex = 0;
    else
        randomIndex = randomIndex+1;
    return random[randomIndex];
}

...并且在活动开始时也执行一次时间:

for (int i=0; i< 100; i++)
        random[i]=(float) Math.random();

我的问题是,这会比使用Math.random()更好(更快)吗?有没有人有更好的建议怎么做?

我也想知道是否有人知道任何好的网站,我可以阅读更多关于如何编写高效的java / android代码。我害怕我有点傻逼。

3 个答案:

答案 0 :(得分:7)

学会信任Java API:它功能强大且速度快。 “过早优化是万恶之源。”在你开始担心这样的事情之前让你的程序工作。

为了您的目的,它可以让您放心地比较您的方法与Java的循环,比如3000万,然后比较时间。

更不用说填充100个随机数的数组然后使用它一百万次并不是随机的。

答案 1 :(得分:3)

这肯定会更快,但从它不会产生非常好的随机数的意义上说它不会“更好”。也许这对你的游戏来说没问题;也许不是。

java.util.Random有一些可能很快的实现。您可以查看Uncommons Maths库,但也有其他人在那里。 Uncommons的“XORShiftRNG”设计得很快。

小心不要做任何过早的优化:如果Math.random在实践中足够快,那么就不用费心去寻找替代品了。只有在对代码中该部分所花费的实际时间进行一些分析后才能做出此决定。

答案 2 :(得分:1)

这是一篇关于优化的文章 http://www.javaworld.com/javaworld/jw-04-1997/jw-04-optimize.html?page=1

您所说的是为随机数制作查找表。大部分时间这都比较快,但在这种情况下它也会改变结果。

一般来说,我的方法总是找到花费最多时间的东西,并尽可能深入地调查。确保你没有做多余的工作,并寻找看起来很奇怪的东西。优化的代码往往将大部分时间花在基本的数学运算上。尽量继续下去,直到你把大部分时间花在数学运算上。

您的代码正在做一些事情,并且可能有更好的方法来做到这一点。因此,请留意最佳算法。

请记住,那里有各种各样的Android设备。很难对所有这些进行优化。有时你必须在优化时采取坚实的通过,然后假设它会得到并且开始减少正在发生的工作量或决定它是不可能的。