private ByteMatcher createRandomByteMatcher() {
        int matcherType = random.nextInt(9);
        boolean inverted = random.nextBoolean();
        switch (matcherType) {
            case 0:
                return AnyByteMatcher.ANY_BYTE_MATCHER;
            case 1:
                return OneByteMatcher.valueOf((byte) random.nextInt(256));
            case 2:
                return new InvertedByteMatcher((byte) random.nextInt(256));
            case 3:
                return new ByteRangeMatcher(random.nextInt(256), random.nextInt(256), inverted);
            case 4:
                return new SetBinarySearchMatcher(createRandomByteSet(), inverted);
            case 5:
                return new SetBitsetMatcher(createRandomByteSet(), inverted);
            case 6:
                return new TwoByteMatcher((byte) random.nextInt(256), (byte) random.nextInt(256));
            case 7:
                return new AllBitmaskMatcher((byte) random.nextInt(256), inverted);
            case 8:
                return new AnyBitmaskMatcher((byte) random.nextInt(256), inverted);
            default:
                throw new RuntimeException("Case statement doesn't support value " + matcherType);
        }
    }