哪个是生成随机位向量的最快方法?

时间:2014-09-17 01:38:36

标签: c++ c++11 random bitset

我有以下问题。假设我想生成一个std::vector<bool>,或std::vector<unsigned int>,甚至是一个只包含0和1的C风格数组,均匀分布(即每次运行时应该有类似0110或1011的东西,你得到这个想法)。有两种方法:

  1. 使用std::uniform_int_distribution(0,1)
  2. 生成每个元素
  3. 生成02^n-1之间的随机整数(其中n是位数),然后使用bitset<n>
  4. 我在这里谈论大型载体,并做了一些时间,但没有得到任何明确的见解。

    有谁知道哪种方法更有效?在我看来,第二种方法应该更好,但我不相信。

1 个答案:

答案 0 :(得分:4)

如果性能受到关注并且您的输出设置需要很大,我会跳过vector&lt; bool&gt;。虽然紧凑,但它们对于访问单个成员的性能较低。

使用std::vector<unsigned int>并在其上调用.resize(N)以确保它足够大,或通过malloc分配C样式数组。如果您使用[index]访问,则其中任何一个都将具有高性能访问权限。

其次,得到你自己的RNG,很多系统的人都很糟糕。例如MSVC使用LCG,虽然右移了16位。即便如此,http://en.wikipedia.org/wiki/Linear_congruential_generator指出,如果你真的在意,应该避免它们。我推荐的是Xor-Shift RNG,因为它(A)速度快,而且(B)由George Marsaglia设计,他是RNG的一位专家。

另一个优点是你可以让自己的RNG每次调用返回一个完整的32位无符号整数,而MSVC rand()和其他只能提供每次调用15位的其他整数。因此,您对rand()的呼叫次数将超过您自己的发电机的两倍。

要实际填充数组,您可以执行以下操作:

void fillarray(unsigned int *data, unsigned int count)
{
    unsigned int randomValue;
    for (int index = 0; index < count; index++)
    {
        if ((index & 31) == 0)
        {
            randomValue = nextRandom();
        }
        data[index] = randomValue & 1;
        randomValue >>= 1;
    }
}