我使用以下代码创建随机位集。现在我想写一些测试并问自己如何测试位集的随机性?这个问题有一个很好的解决方案吗?
由于位集不能表示为数字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;
}
答案 0 :(得分:0)
将(从多个循环中的所有位)写入(顺序)到二进制文件。尝试写入大约500KB的数据。然后学会使用像ent这样的现有工具。你做了-bn文件名,看看你是否得到了好的结果。这是标准测试。
当你变得更好时,试试Diehard。这需要大约10MB的测试数据,但要可靠地理解起来要困难得多。
买者。
由于您正在运行Mersenne Twister,因此您只需验证您的bitset创建例程。 Twister的实施应该已经过审查。您不应该需要Diehard,因为您的bitset生成器已经过ent。
的充分测试