我需要生成一些随机boolean
值。
但是,我需要确保在100次通话中获得10 true
次。此外,我需要true
值非常均匀地分布(例如,第二个true
将在9 false
之后出现,第三个将在7之后出现false
{1}}等等。我尝试使用java.util.Random
nextBoolean()
方法实现此功能,但似乎true
值在开始时过度拥挤。有人可以帮忙吗?
答案 0 :(得分:4)
这是一些实现stratified sampling技术的代码:
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;
}
答案 1 :(得分: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();
答案 2 :(得分:0)
如果你想要真正随机地克服N,你可以创建一个K trues和N-K trues的数组,并使用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个字面间隔一次,请使用Ted的答案,相反,虽然目前还不清楚你是否真的想从你的描述中找到它。
答案 3 :(得分: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;
}