double[] a = new double[size];
for (int i = 0; i < size; i++) {
double randomNum = Math.random() * 100;
a[i] = randomNum;
for (int j = 0; j < i; j++) {
if (a[i] == a[j]) {
i--;
break;
}
}
我上面有一段代码,用于检查数组中double
的唯一性。我已经运行了几次我的程序,结果是我想要的。
但是,我回过头来追踪该程序,可能在代码中发现了一个缺陷。如果相同的数字连续两次随机生成,我认为上面的代码会失败。假设第一个双精度是1.0
,那么接下来的两个随机生成的双精度恰好也是1.0
...由于{{1}的条件,内部for循环永远不会被执行从1递减到0,因此对于生成的第二个数字,检查将失败。
有人确认这是否属实,因为我不熟悉Java。
答案 0 :(得分:1)
不,你拥有的是正确的。内部循环将在您刚刚生成的数字之前运行到索引。如果你刚刚生成了[5],内部循环会将[5]与[0],[1],a [2],a [3]和[4]进行比较。
因为我在递减之后会立即再次递增(当外部循环继续时),它不会像你想知道的那样在检查中失败。如果[1]结果为[0]的副本,则i从1递减到0,然后立即递增回1。
作为旁注,由于你要产生双打,除非你产生大量的数据,否则你几乎不会得到重复。
答案 1 :(得分:0)
您应该使用Collection.contains方法(或为您的数组编写类似的内容),因为它们可以防止重复。 Set(例如SortedSet)确实针对某些用例进行了性能优化。
答案 2 :(得分:0)
使用Set而不是数组。
Set<Double> set = new HashSet<>();
for (int i = 0; i < size; i++) {
set.add(Math.random() * 100)
}
System.out.println(set);
现在你只有唯一的价值