1

我需要生成一些随机boolean值。

但是,我需要确保true在 100 次通话中准确获得 10 次。另外,我需要这些true值几乎是均匀分布的(例如,第二个true将在 9 之后false,第三个将在 7 之后false,等等)。我尝试使用java.util.Random'snextBoolean()方法来实现这一点,但似乎这些true值一开始就过于拥挤。任何人都可以帮忙吗?

4

4 回答 4

4

下面是一些实现分层抽样技术的代码:

boolean[] get10in100() {
    boolean[] result = new boolean[100];
    Random rand = new Random();
    for (int i = 0; i < 10; ++i) {
        result[10 * i + rand.nextInt(10)] = true;
    }
    return result;
}
于 2013-03-10T04:41:30.140 回答
0

如果你想真正随机地从 N 个中完全随机化 K 个,你可以创建一个包含 K 个和 NK 个真的数组,并使用 Collections 上的 shuffle 方法进行随机化。

List<Boolean> values = new ArrayList<Boolean>();
for (int i = 0; i < 10; i++) {
  values.add(true);
}
for (int i = 0; i < 90; i++) {
  values.add(false);
}

Collections.shuffle(values);

如果您希望它从字面上每隔 10-ish 间隔一次,请改用 Ted 的答案,尽管目前尚不清楚您是否真的希望从您的描述中得到它。

于 2013-03-10T04:49:35.387 回答
0

取决于你想如何定义随机性......这是一种可能性:

boolean[] ranbool = new boolean[100];
Random rng = new Random();
for (int i = 0 ; i < 10 ; i++)
    ranbool[rng.nextInt(100)] = true;

// 下面是多余的

for (int i = 0 ; i < 100 ; i++)
    System.out.print ((ranbool[i]) ? "X" : "O");
System.out.println();
于 2013-03-10T04:44:50.527 回答
0

几乎没有增强的通用 @ted-hopp 解决方案,用于创建布尔的分布式 prim 数组

也许它会对某人有所帮助:

public static boolean[] getRandomBooleanArray(int itemsCount, int truePercentage) {
    Random rand = new Random();
    boolean[] result = new boolean[itemsCount];
    int boolCount = (int) (itemsCount * truePercentage * 0.01); // true items count
    int step = (itemsCount + boolCount - 1) / boolCount; // calculate step
    for (int i = 0; i < boolCount; ++i) {
        int noise = rand.nextInt(step); // calculate noise
        int index = step * i + noise; // initial index
        int realIndex = index < itemsCount ? index : itemsCount-1; // ensure min index
        result[realIndex] = true;
    }
    return result;
}
于 2016-01-16T21:22:09.017 回答