这是生成随机比特向量的最快方法
Which is the fastest way of generating a vector of random bits?
我有以下问题。假设我想生成一个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>
我在这里谈论的是大矢量,我做了一些时间安排,但没有得到任何明确的见解。
有人知道哪种方法更有效吗?我认为第二种方法应该更好,但我不相信。
如果性能是一个问题,并且您的输出集需要很大,我会跳过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;
}
}
相关文章:
- C++从另一个类访问公共静态向量的正确方法是什么
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 声明高维向量的更简洁的方法
- 在C++中初始化向量映射的最有效方法
- C++11 迭代向量的新方法?
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 访问类成员向量最后一项的正确方法
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 检查两个向量是否并行的最有效方法
- 如何从 node-ffi 调用 c++ 中以结构向量作为参数的方法?
- 返回向量元素的 l 值的正确方法是什么?
- 如何在方法主体中返回声明向量的引用?