我在0-20的范围内产生的非重复的随机数的数组作为是否可以改变随机数的范围?
int[] numbers = {6,14,11,18,13};
现在,我想这些数字在0-10的范围内转换和欲导致非重复如好。
可能吗?
任何类型的建议,将不胜感激。
我在0-20的范围内产生的非重复的随机数的数组作为是否可以改变随机数的范围?
int[] numbers = {6,14,11,18,13};
现在,我想这些数字在0-10的范围内转换和欲导致非重复如好。
可能吗?
任何类型的建议,将不胜感激。
如果随机生成的数字大于10,那么可以减去10。我知道这不是一个合适的解决方案,但它肯定会为你工作。
对于小于10的数字它不起作用 –
小于10的数字已经在范围内0-10 –
这里是我想出了三种方法:
// 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
删除所有的重复。
Upvoted for the减10选项,这应该工作AFAIK。 –
如果使用Java8,则可以使用下面的代码来生成唯一的随机数:
int[] rand = new Random().ints(0, 11).distinct().limit(5).toArray();
此代码生成5支独特的随机数范围从0到10分
范围0- 20包含21个数字,0-10包含11个数字。所以导致统一分布数字的唯一解决方案是取原始集合中0-10范围内的数字,并在11-20范围内丢弃数字。
不,我不同意。如果“0-10”被均匀分配,那么为什么“0-20”不会被均匀分配? –
@TimBiegeleisen问题是,如果您尝试使用0-20中的所有数字映射到0-10时,11个结果中的其中一个将比其他结果少。 – Henry
好的,你可能是对的。 OP应清楚地告诉我们范围以及每个端点是否打开或关闭。 –
您可以使用if条件在增强for循环中迭代数组。您可以使用arraylist或任何其他数据结构来存储小于10的随机数,因此您已经具有非重复值。
ArrayList<Integer> numberList = new ArrayList<>();
for(int number:numbers){
if(number<10){
numberList.add(number);
}
}
一个可能的解决方案是使用具有double值的帮助程序数组。
该算法是下一步。
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;
}
适用于大多数情况,但有一些错误,如您所说 –
我没有深入从双倍转换到整数。如果你想要,你可以尝试改进这行代码'newIntNumbers [i] =(int)Math.round(newNumbers [i]);'。这应该可以解决这些'错误'。 –
是的,一些时间值重复了像10,11等关闭数字 –
仅仅通过2 – Turing85
鸿沟我想到过,但它给像10和11 –
的数字相同的结果,无论是除以2,每个号码为@ Turing85建议,或直接删除所有号码大于10任方式应该工作。 –