这是生成随机比特向量的最快方法

Which is the fastest way of generating a vector of random bits?

本文关键字:向量 方法 随机      更新时间:2023-10-16

我有以下问题。假设我想生成一个std::vector<bool>std::vector<unsigned int>,甚至是一个只包含0和1的C样式数组,它们是均匀分布的(即,在每次运行时都应该有0110或1011之类的东西,你会明白的)。有两种方法:

  1. 使用std::uniform_int_distribution(0,1)生成每个元素
  2. 生成02^n-1之间的随机整数(其中n是比特数),然后使用bitset<n>

我在这里谈论的是大矢量,我做了一些时间安排,但没有得到任何明确的见解。

有人知道哪种方法更有效吗?我认为第二种方法应该更好,但我不相信。

如果性能是一个问题,并且您的输出集需要很大,我会跳过vector<bool>。虽然结构紧凑,但访问单个成员的性能较低。

使用std::vector<unsigned int>并对其调用.resize(N)以确保其足够大,或者通过malloc分配一个C风格的数组。如果您使用[index]进行访问,那么这两种方法中的任何一种都将具有性能访问权限。

其次,拥有你自己的RNG,很多系统都很糟糕。例如MSVC使用尽管右移了16位的LCG。即便如此,http://en.wikipedia.org/wiki/Linear_congruential_generator注意,如果你真的很在乎,就应该避免。我的推荐是Xor Shift RNG,因为它(A)快得令人眼花缭乱,(B)由George Marsaglia设计,他有点像RNG专家。

另一个优点是,您可以让自己的to RNG每次调用返回一个完整的32位无符号int,而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;
    }
}