我有以下问题。假设我想生成一个std::vector<bool>
,或std::vector<unsigned int>
,甚至是一个只包含0和1的C风格数组,均匀分布(即每次运行时应该有类似0110或1011的东西,你得到这个想法)。有两种方法:
std::uniform_int_distribution(0,1)
0
和2^n-1
之间的随机整数(其中n
是位数),然后使用bitset<n>
我在这里谈论大型载体,并做了一些时间,但没有得到任何明确的见解。
有谁知道哪种方法更有效?在我看来,第二种方法应该更好,但我不相信。
答案 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;
}
}