[英]How can I generate random numbers where each digit lies within a number range?
我试图弄清楚如何在数组中生成和存储10个随机数,其中数字是两位数,每个数字都在0-7范围内。 例如,10、23、35、77都可以,但是1,78,89,99都可以。 而且,我想确保所有数字都是唯一的。 到目前为止,这是我要提出的...
import java.util.Random;
public class RandomNum{
public static void main(String[] args){
Random rand=new Random();
int[] randomFirstDigit=new int[10];
int[] randomSecondDigit=new int[10];
for(int i=0;i<10;i++){
randomFirstDigit[i]=rand.nextInt(7-1+1)+1;
}
for(int i=0;i<10;i++){
randomSecondDigit[i]=rand.nextInt(7-1+1)+0;
}
int[] randomArr=new int[10];
for(int i=0;i<10;i++){
randomArr[i]=(randomFirstDigit[i]*10)+randomSecondDigit[i];
}
for(int i=0;i<=randomArr.length;i++){
System.out.println(randomArr[i]);
}
}
}
上述代码的主要问题是,有时数组值不是唯一的。 换句话说,两个相同的数字像23,23一样存储在数组中。
谁能帮我解决这个问题。
在此先感谢您的帮助。
因此,可能数字的列表为[10, 11, 12, ..., 17, 20, ..., 76, 77]
,大小为7 * 8
。 我们需要的是代表该列表上索引的10个不同的随机数,然后我们可以使用i -> (i / 8 + 1) * 10 + (i % 8)
将它们映射到实际数字。
这是一个使用ThreadLocalRandom.ints
的非常简单的解决方案:
int[] array = ThreadLocalRandom.current()
.ints(0, 7 * 8)
.distinct()
.limit(10)
.map(i -> (i / 8 + 1) * 10 + (i % 8))
.toArray();
一种更简单,更省钱的解决方案是一次生成一个数字,然后将其附加到字符串中。 之后可以将其转换为整数。
要生成正好10个唯一的数字,我们可以将生成的每个数字添加到HashSet中 ,其中每个元素都必须是唯一的。 我们可以继续进行直到HashSet具有10个元素。
import java.util.Random;
import java.util.Set;
import java.util.HashSet;
public class TwoDigitGenerator {
public static void main(String[] args) {
// Generate 10 unique random numbers with desired properties.
Set<Integer> usedNumbers = new HashSet<>();
while (usedNumbers.size() < 10)
usedNumbers.add(randomNumber());
// Convert the set of numbers to an Integer array.
Integer[] numbers = usedNumbers.toArray(new Integer[usedNumbers.size()]);
for (Integer number : numbers)
System.out.println(number);
}
public static int randomNumber() {
Random random = new Random();
String number = "";
number += 1 + random.nextInt(7); // Generate first digit between 1 and 7 inclusively
number += random.nextInt(8); // Generate second digit between 0 and 7 inclusively
return Integer.parseInt(number);
}
}
请您再次循环该数组,并检查其是否已经存在。 这不是最佳解决方案,因为某些代码是多余的,但可以为您提供一些提示,说明如何进行处理。
import java.util.Random;
public class RandomNum{
public static void main(String[] args){
Random rand=new Random();
int[] randomFirstDigit=new int[10];
int[] randomSecondDigit=new int[10];
for(int i=0;i<10;i++){
int gen = rand.nextInt(7-1+1)+1;
Boolean flag = false;
for(int j=0; j < 10; j++)
if(randomFirstDigit[j] == gen)
flag = true
if(!flag) randomFirstDigit[i] = gen;
}
for(int i=0;i<10;i++){
int gen = rand.nextInt(7-1+1)+0;
Boolean flag = false;
for(int j=0; j < 10; j++)
if(randomSecondDigit[j] == gen)
flag = true;
if(!flag) randomSecondDigit[i] = gen;
}
int[] randomArr=new int[10];
for(int i=0;i<10;i++){
randomArr[i]=(randomFirstDigit[i]*10)+randomSecondDigit[i];
}
for(int i=0;i<=randomArr.length;i++){
System.out.println(randomArr[i]);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.