我有一系列非重复随机数,在0-20范围内生成
int[] numbers = {6,14,11,18,13};
现在,我想在0-10范围内转换这些数字,我希望结果也不重复。
有可能吗?
任何建议都将受到赞赏。
答案 0 :(得分:2)
将它们除以2是一个很好的解决方案,因为您具有相同的输入大小并保持一致性:
对于[0; 10 [中的每个数字x的每个数字,它可以来自[0; 20 [:2 * x和2 * x + 1]中的两个数字。
对于像10和11这样的数字,它会给你相同的结果,但谁在乎呢?
答案 1 :(得分:2)
以下是我提出的三种方法:
// divide by 2
Arrays.stream(numbers).map(x -> x / 2);
// subtract 10 from everything that's > 10
Arrays.stream(numbers).map(x -> x > 10 ? x - 10 : x);
// remove every number that's > 10
Arrays.stream(numbers).filter(x -> x < 10);
现在我知道你不想重复数字,你应该通过调用distinct
删除所有重复项。
答案 2 :(得分:1)
如果随机生成的数字大于10,你可以减去10.我知道这不是一个合适的解决方案,但它绝对适合你。
答案 3 :(得分:1)
如果您使用的是Java8,则可以使用以下代码生成唯一的随机数:
int[] rand = new Random().ints(0, 11).distinct().limit(5).toArray();
此代码生成5个唯一的随机数,范围从0到10.
答案 4 :(得分:0)
范围0-20包含21个数字,0-10包含11个数字。因此,导致均匀分布数字的唯一解决方案是仅取出原始集合中0-10范围内的数字,并丢弃11-20范围内的数字。
答案 5 :(得分:0)
您可以使用if条件在增强的for循环中迭代数组。由于您从数字数组中获取值,因此您已经具有非重复值。您可以使用arraylist或任何其他数据结构来存储小于10的随机数。 / p>
ArrayList<Integer> numberList = new ArrayList<>();
for(int number:numbers){
if(number<10){
numberList.add(number);
}
}
答案 6 :(得分:0)
一种可能的解决方案是使用具有双值的辅助数组。
接下来是算法。
coefficient = 10 / max
。 备注强>
这是它的代码。
public static void main(String[] args) {
int[] numbers = { 6, 14, 11, 18, 13 };
// crate a new array with double values
double[] newNumbers = new double[numbers.length];
for (int i = 0; i < numbers.length; i++) {
newNumbers[i] = (double) numbers[i] / 2;
}
// get coefficient
double max = maxValue(newNumbers);
double coefficient = 10 / max;
// scale numbers
for (int i = 0; i < newNumbers.length; i++) {
newNumbers[i] = newNumbers[i] * coefficient;
}
int[] newIntNumbers = new int[newNumbers.length];
for (int i = 0; i < newNumbers.length; i++) {
newIntNumbers[i] = (int) Math.round(newNumbers[i]);
}
System.out.println(Arrays.toString(newNumbers));
System.out.println();
System.out.println(Arrays.toString(newIntNumbers));
}
private static double maxValue(double[] array) {
double max = Double.MIN_VALUE;
for (double num : array) {
max = Math.max(max, num);
}
return max;
}