java - 生成一个包含 n 个 1 的随机 BitSet

标签 java random bitset

Possible Duplicate:
Randomly pick k bits out of n from a Java BitSet

是否有一种简单的方法来生成大小为 n*n(例如 64)且以随机顺序恰好有 n(例如 8)个 1 的随机 BitSet?

我想到的是,我可以生成一个随机位集并检查 bitSet.cardinality() 是否为 8,如果不是,则重试,但这似乎是一个性能不佳的解决方案。

谁有更好的主意?

最佳答案

使用reservoir sampling ,这可以在 O(N) 时间内完成:

public static BitSet randomBitSet(int size, int cardinality, Random rnd) {
    if (0 > cardinality || cardinality > size) throw new IllegalArgumentException();
    BitSet result = new BitSet(size);
    int[] chosen = new int[cardinality];
    int i;
    for (i = 0; i < cardinality; ++ i) {
        chosen[i] = i;
        result.set(i);
    }
    for (; i < size; ++ i) {
        int j = rnd.nextInt(i+1);
        if (j < cardinality) {
            result.clear(chosen[j]);
            result.set(i);
            chosen[j] = i;
        }
    }
    return result;
}

关于java - 生成一个包含 n 个 1 的随机 BitSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12817946/

相关文章:

c++ - std::bitset 位顺序是可移植的吗?

c++ - 将 uint8_t 的 vector 转换为位集

javascript - 如何通过 Java 使用 Selenium 从 en.wikipedia.org 中提取一个国家的人口数据

java - Spring REST 从另一个类获取列表

java - 从头到尾遍历 LinkedList

java - 如何用随机数和一些条件创建一个数组?

java - TeamCity::如何在 Java 中访问 teamcity 构建 ID

arrays - Julia 中随机输出的数组理解

r - 独立排列/随机化列中的行

algorithm - 有效地找到位集中第 k 个设置位的位置