我使用下面的代码创建随机位集。现在我想写一些测试并问自己如何测试位集的随机性?这个问题有好的解决方案吗?
由于位集不能表示为数字 AFAIK,我不知道如何应用某种测试,如卡方或其他。
我应该计算 1 和 0 的出现次数吗?
1001
+0101
+1110
+0010
----
2222 = good as half of 4 (bitsets) equal 2
还有其他方法吗?
template <size_t N>
using bitset_t = std::bitset<N>;
和
template <size_t N>
struct random_bitset_t
{
static_assert(N % 64 == 0, "random_bitset_t<N> only with N % 64 == 0");
std::bitset<N> operator()() const;
};
template <size_t N>
std::bitset<N> random_bitset_t<N>::operator()() const
{
static thread_local std::mt19937 g{std::random_device{}()};
static thread_local std::uniform_int_distribution<uint64_t> d;
std::bitset<N> bitset;
for (int i=0,j=N/64; i<j; ++i)
{
bitset <<= 64;
bitset |= std::bitset<N>(d(g));
}
return bitset;
}
和
template <size_t N>
using bitsets_t = std::vector<bitset_t<N>>;
和
template <size_t N>
struct random_bitsets_t
{
random_bitsets_t(size_t);
bitsets_t<N> operator()() const;
size_t size;
};
template <size_t N>
random_bitsets_t<N>::random_bitsets_t(size_t size)
: size(size)
{}
template <size_t N>
bitsets_t<N> random_bitsets_t<N>::operator()() const
{
bitsets_t<N> bitsets;
bitsets.reserve(size);
std::generate_n(std::back_inserter(bitsets),size,random_bitset_t<N>());
return bitsets;
}