Java 数组中的随机数
我需要用一个可能的50中的5个随机数填充数组A。允许重复。然后,我需要第二次填充同一个数组,但要使用在第一次或第二次填充数组时没有出现的唯一数字。我正在使用下面的代码第二次生成数组。我一直在研究如何同时搜索第一个数组中的重复项。感谢您的帮助!谢谢Java 数组中的随机数,java,arrays,algorithm,random,Java,Arrays,Algorithm,Random,我需要用一个可能的50中的5个随机数填充数组A。允许重复。然后,我需要第二次填充同一个数组,但要使用在第一次或第二次填充数组时没有出现的唯一数字。我正在使用下面的代码第二次生成数组。我一直在研究如何同时搜索第一个数组中的重复项。感谢您的帮助!谢谢 boolean drawn; for (int i=0; i<A.length; i++) { do { drawn = false;
boolean drawn;
for (int i=0; i<A.length; i++) {
do {
drawn = false;
A[i] = 1 + (int)(Math.random() * 50);
for (int j=0; j<i; j++)
if (A[i] == A[j])
drawn = true;
} while (drawn);
布尔绘制;
对于(int i=0;i使用列表跟踪所有允许的数字,并在使用时将其从列表中删除。然后,对于“第二次传递”,不要总是获取随机数*50,而是获取随机数*List size()。然后实际使用的数字是List.get(location),而不仅仅是number
(您的列表将以1,2,3,4,5开始,但当使用3时,列表将变为1,2,4,5,…,因此当您得到下一个“random()”数字3时,实际上是一个4。)将您的50个候选随机数存储在大小为50
的数组中
将计数器初始设置为random.length
。因此,此处计数器将初始化为49
然后从0
到counter-1
生成一个数字r
,并选择random[r]
作为您的数字
现在继续,用random[counter-1]
交换random[r]
。减量counter
,这样下次您将只搜索数组的前49个元素,并在选择数字时继续此过程
现在,如果您想要一个以前没有选择过的数字,只需将r
从0
生成到counter-1
,这样random[r]
就来自数组中最开始的唯一元素
int[] randoms= new int[50];
.
. //populate your array with the candidate numbers
.
int counter= randoms.length;
Random rand = new Random();
public int getUnique(){
//Get a random number in the range 0 to counter-1
int r = rand.nextInt(counter);
int myElement = randoms[r];
randoms[r] = randoms[counter-1];
randoms[counter-1]= myElement;
counter--;
return myElement;
}
当您想要允许重复时,从0
到random.length-1
生成一个r
,并选择random[r]
作为您的号码。请注意,我们仍然需要跟踪所使用的号码,以便getUnique()
仍然有效:
public int getAny(){
//Get a random number in the range 0 to random.length-1
int r = rand.nextInt(random.length);
int myElement = randoms[r];
if(r < counter){
randoms[r] = randoms[counter-1];
randoms[counter-1]= myElement;
counter--;
}
return myElement;
}
public int getAny(){
//获取0到random.length-1范围内的随机数
int r=rand.nextInt(随机长度);
int myElement=randoms[r];
if(r<计数器){
随机数[r]=随机数[counter-1];
随机[counter-1]=myElement;
计数器--;
}
返回元素;
}
您可以创建一个包含50个数字的列表,并使用随机数获得0到50之间的5个索引,以创建第一个随机数组
对于第二步,创建第一个列表的副本,但删除第一个随机数组中的数字。然后洗牌第二个列表(使用Collections.shuffle()
),并获取前5个元素。由于需要存储以前的数组元素,因此每次填充数组时都必须使用一个额外的数组。例如:
boolean drawn;
System.arraycopy( A, 0, B, 0, A.length );
for (int i=0; i<A.length; i++) {
do {
drawn = false;
A[i] = 1 + (int)(Math.random() * 50);
for (int j=0; j<A.length; j++)
if (A[i] == B[j])
drawn = true;
for (int j=0; j<i; j++)
if (A[i] == A[j])
drawn = true;
} while (drawn);
布尔绘制;
数组复制(A,0,B,0,A.长度);
对于(int i=0;i我会这样做:
List<Integer> choices = new ArrayList<Integer>();
Random r = new Random();
for(int i = 0; i <N;i++)
{
choices.add(r.nextInt(N-1)+1;
}
Set<Integer> uniques = new HashSet<Integer>();
Collections.shuffle(uniques);
//remove first 5 entries from uniques
//repeat for second pass
List choices=new ArrayList();
随机r=新随机();
对于(int i=0;我将在纸上绘制逻辑。您可以使用if-then逻辑,尽管我认为有很多方法可以简化此CATI。如果您使用列表而不是数组,您可以利用该方法。@user1930614。不要只是复制代码。尝试了解到底发生了什么。这将对您的长期发展有所帮助。