生成随机位的最快方法

时间:2009-05-15 08:41:19

标签: c++ random

生成大量(伪)随机位的最快方法是什么。每个位必须是独立的,并且具有相同概率的零或一个。

我显然可以做一些变化
randbit=rand()%2;

但我觉得应该有一种更快的方法,从每次调用随机数生成器生成几个随机位。理想情况下,我想获得一个int或char,其中每个位是随机且独立的,但其他解决方案也是可能的。

应用程序本质上不是加密的,因此强随机性不是主要因素,而速度和获得正确的分布非常重要。

11 个答案:

答案 0 :(得分:5)

将随机数转换为二进制
为什么不只得到一个数字(适当大小以获得你需要的足够数量)然后将其转换为二进制数。你实际上会从随机数中获取位,这意味着它们也是随机的。

零和1也具有50%的概率,因为将0和2 ^ n之间的所有数字限制并且计数零和1的数量相等>意味着0和1的概率是相同的。

关于速度
这可能会非常快,因为只获得一个随机数与其中的位数相比更快。它现在完全取决于你的二进制转换。

答案 1 :(得分:4)

查看Boost.Random,尤其是boost::uniform_int<>

答案 2 :(得分:3)

如你所说,只是生成随机整数 然后你有32个随机位,其中1和0都是同样可能的。

获取循环中的位:

for (int i = 0; i < 32; i++)
{
  randomBit = (randomNum >> i) & 1
  ...
  // Do your thing
}

重复此操作,需要多次才能获得正确的位数。

答案 3 :(得分:2)

这是一个非常快的,我用Java编码基于George Marsaglia的XORShift算法:一次得到64位!

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

答案 4 :(得分:1)

SMP Safe (i.e. Fastest way possiable these days) and good bits

注意使用[ThreadStatic]属性,这个对象自动处理新线程,没有锁定。这是您确保高性能随机SMP锁定的唯一方法。

http://blogs.msdn.com/pfxteam/archive/2009/02/19/9434171.aspx

答案 5 :(得分:0)

你可以生成一个随机数并继续向右移位并测试最低有效位以获得随机位而不是进行mod操作。

答案 6 :(得分:0)

如果我记得正确,那么最低有效位通常具有“较少随机” 对于大多数pseuodo随机数生成器的分布,因此如果您担心分布,使用模数和/或生成的数字中的每个位都会很糟糕。

(也许你应该至少谷歌Knuth说的......)

如果存在(并且很难在不知道您正在使用的算法的情况下很难分辨),只需使用每个生成的数字中的最高位。

http://en.wikipedia.org/wiki/Pseudo-random

答案 7 :(得分:0)

您需要多大的生成位数?如果它不大于几百万,并且记住你没有使用生成器加密,那么我认为最快的方法是预先计算一组具有正确分布的整数,将其转换为文本像这样的文件:

unsigned int numbers[] =
{
  0xABCDEF34, ...
};

然后将数组编译到您的程序中,一次一个数字。

这样,每次调用都会获得32位(在32位处理器上),生成时间最短,因为所有数字都是预先生成的,并且分配由您控制。当然,缺点是这些数字根本不是随机数,这取决于您使用PRNG的内容可能或不重要。

答案 8 :(得分:0)

如果你一次只需要一点尝试 bool coinToss() { return rand()&1; }从技术上讲,生成位的速度更快,因为将%2替换为等效的&amp; 1。

答案 9 :(得分:0)

#include <iostream>
#include <bitset>
#include <random>

int main()
{
    const size_t nrOfBits = 256;
    std::bitset<nrOfBits> randomBits;

    std::default_random_engine generator;
    std::uniform_real_distribution<float> distribution(0.0,1.0);

    float randNum;
    for(size_t i = 0; i < nrOfBits; i++)
    {
        randNum = distribution(generator);
        if(randNum < 0.5) {
            randNum = 0;
        } else {
            randNum = 1;
        }
        randomBits.set(i, randNum);
    }

    std::cout <<  "randomBits =\n" << randomBits << std::endl;
    return 0;
}

在我的测试中,这花了256位,花了4.5886e-05s。

答案 10 :(得分:-3)

只需读取一些内存 - 占用原始内存的一小部分。这将是非常随机的。

或者,生成一个大的随机int x并使用位值。

for(int i = (bitcount-1); i >= 0 ; i--) bin += x & (1 << i);