0

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

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

1 回答 1

0

将许多循环中的所有位(按顺序)写出到二进制文件中。尝试写入大约 500KB 的数据。然后学习使用现有的工具,如 ent。你会做 ent -b filename 看看你是否能得到好的结果。这是一个标准测试。

当您变得更好时,请尝试死硬。这需要大约 10MB 的测试数据,但要可靠地理解要困难得多。

警告。

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

于 2017-04-28T22:07:04.233 回答