代码之家  ›  专栏  ›  技术社区  ›  Mick

廉价而愉快的rand()替代品

  •  9
  • Mick  · 技术社区  · 15 年前

    在分析了一个大型游戏程序之后,我发现库函数rand()占用了相当大的处理时间。我对随机数生成器的要求并不十分苛刻——它通过一系列纯粹随机性的统计测试并不重要。我只想买些便宜又愉快的东西,速度很快。有什么建议吗?

    7 回复  |  直到 15 年前
        1
  •  7
  •   Joey Gumbo    15 年前

    很少有算法比 LCG (很可能是什么 rand() 正在使用)。你可以试试马萨格里亚的 Xorshift 发电机非常快(取决于硬件)。这个 WELL512a 发电机也相当快(比MT19937或MT19937-64还要快)。

        2
  •  4
  •   Johan Kotlinski    15 年前

    你可能在找一个 linear congruential generator .

        3
  •  2
  •   INS    15 年前

    您可以对随机数使用一些预先计算的值,并将它们存储在一些数组中。这个 RNG 算法不是一项很容易完成的任务。如果你只需要少量的随机数,我认为这是一个解决方案。

    通常在游戏中有很多预先计算(sin/cos值和其他在视频游戏中经常使用的东西,如果不是预先计算的话,它会消耗大量的CPU周期)。

    你也可以看看 HW RNG 但我认为这是不可能的。

        4
  •  2
  •   mikera    15 年前

    这里我为Java编写了一个基于MaSalia的XORSHIFT算法,你很可能会适应它。为我的目的(游戏开发,模拟)工作得很好。

    /**
     * State for random number generation
     */
    private static volatile long state=xorShift64(System.nanoTime()|0xCAFEBABE);
    
    /**
     * Gets a long random value
     * @return Random long value based on static state
     */
    public static final long nextLong() {
        long a=state;
        state = xorShift64(a);
        return a;
    }
    
    /**
     * XORShift algorithm - credit to George Marsaglia!
     * @param a Initial state
     * @return new state
     */
    public static final long xorShift64(long a) {
        a ^= (a << 21);
        a ^= (a >>> 35);
        a ^= (a << 4);
        return a;
    }
    
        5
  •  1
  •   Jens Gustedt    15 年前

    因为您对实现没有太多的了解,所以如果使用一个使用全局状态的函数来进行多线程处理,那么这几乎总是一个坏主意。许多实现只使用互斥来保护并发访问。你将观察到的很长的时间就是等待时间,而不是兰德函数本身的计算。 posix有rand48系列的函数,这些函数也有可重入版本,在并发访问方面应该做得更好,请参见 http://opengroup.org/onlinepubs/007908799/xsh/drand48.html

        6
  •  0
  •   unomi    15 年前

    这可能不是一个很好的答案,实际上更像是一个问题。

    取决于平台和取决于值的频率,微秒返回函数中最不重要的数字不是近似于“随机”吗?

        7
  •  0
  •   Kramii    15 年前

    据说,Mersenne Twister比许多RAND实现更快,但YMMV取决于实现细节和硬件。