我需要生成一些随机boolean
值。
但是,我需要确保true
在 100 次通话中准确获得 10 次。另外,我需要这些true
值几乎是均匀分布的(例如,第二个true
将在 9 之后false
,第三个将在 7 之后false
,等等)。我尝试使用java.util.Random
'snextBoolean()
方法来实现这一点,但似乎这些true
值一开始就过于拥挤。任何人都可以帮忙吗?
下面是一些实现分层抽样技术的代码:
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;
}
如果你想真正随机地从 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 的答案,尽管目前尚不清楚您是否真的希望从您的描述中得到它。
取决于你想如何定义随机性......这是一种可能性:
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();
几乎没有增强的通用 @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;
}