如何测试std :: bitset的随机性?

时间:2017-04-28 13:17:32

标签: c++ testing random bitset std-bitset

我使用以下代码创建随机位集。现在我想写一些测试并问自己如何测试位集的随机性?这个问题有一个很好的解决方案吗?

由于位集不能表示为数字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;
}

1 个答案:

答案 0 :(得分:0)

将(从多个循环中的所有位)写入(顺序)到二进制文件。尝试写入大约500KB的数据。然后学会使用像ent这样的现有工具。你做了-bn文件名,看看你是否得到了好的结果。这是标准测试。

当你变得更好时,试试Diehard。这需要大约10MB的测试数据,但要可靠地理解起来要困难得多。

买者。

由于您正在运行Mersenne Twister,因此您只需验证您的bitset创建例程。 Twister的实施应该已经过审查。您不应该需要Diehard,因为您的bitset生成器已经过ent。

的充分测试