I create random bitsets with following code below. Now I wanna write some test and asking myself how to test the randomness of bitsets? Is there a good solution to this problem?
As bitsets can not be represented as numbers AFAIK, I don't know hot to apply some sort of test like chi-square or whatever.
Should I count the ocurrences of 1s and 0s like
1001
+0101
+1110
+0010
----
2222 = good as half of 4 (bitsets) equal 2
Are there other ways?
template <size_t N>
using bitset_t = std::bitset<N>;
and
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;
}
and
template <size_t N>
using bitsets_t = std::vector<bitset_t<N>>;
and
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;
}
Aucun commentaire:
Enregistrer un commentaire