int getnum50()
{
Random rand = new Random();
return (1+rand.nextInt(50));
}
getnum50()
的预定义函数,该函数返回一个
整数,是1-50的一个随机数。getnum50()
。以随机顺序打印数字1-100。 (不是100个随机数)
注意:
我写了一些显示正确输出的代码。
import java.util.Random;
public class RandomInteger{
int number[]=new int[100];//To store numbers in random order
public RandomInteger(){
int n[]=new int[100];//array to store which random numbers are generated
int off[]={-1,0};//offset to add
System.out.println("Length of array number100 is:"+number.length);
System.out.println("Generating random numbers in the range 1-100:");
for(int n1=0;n1<number.length;n1++){
int rnd=off[(getnum50()-1)/50]+(getnum50()*2);
if(n[rnd-1] == 0){
n[rnd-1]=1;//to indicate which random number is generated
number[n1]=rnd;
System.out.println(number[n1]+" ");
}
}
}
//end of constructor
int getnum50(){
Random rand = new Random();
return (1+rand.nextInt(50));
}
public static void main(String args[]){
RandomInteger m= new RandomInteger();
}
//end of main()
}
//end of class
虽然在那一轮被接受,但在下一轮中,面试官告诉我getnum50()
是一种代价高昂的方法,即使在最好的情况下,我也必须为每个生成的数字调用两次。即1-100的200次。在最坏的情况下,它将是无限的,平均情况下数万。他要求我优化代码,以便显着改善平均情况。
我无法回答。所以请给我正确的答案吗?我将如何优化上面的代码?
答案 0 :(得分:2)
一个愚蠢的优化就是要意识到,由于您的随机源限制为1-50,您可以设置两个阵列位置,例如
rand = getnum50();
n[rand] = 1;
n[rand+50] = 1;
现在数组会稍微“少”随机,因为每个索引n
只是n+50
的1/2,但至少你已经减少了一半的构建数组施工时间。
答案 1 :(得分:2)
我认为他们希望你制作一个随机算法。
在这里,你从一个正好是100个数字(按顺序为1到100)的数组开始,然后在每次迭代时你将数字洗牌。
做足够多次,原始数组是完全随机的。
答案 2 :(得分:0)
50是红鲱鱼。使用两个调用random50,mod 10.现在你有两个数字:十位和一位。这给你一个random100()函数。
真正的杀手是生成并检查方法。相反,将数字1-100放入arraylist,并使用random100来删除随机索引。现在你最糟糕的情况是有2n次调用random50。还有一些问题需要解决 - 超支 - 但这就是我要看的方法。
答案 3 :(得分:0)
你两次调用方法getnum50()的原因是因为这一行:
int rnd = off[(getnum50()-1)/50] + (getnum50()*2);
这似乎是不言自明的。你最糟糕的情况是如此糟糕的原因是因为这个块:
if(n[rnd - 1] == 0){
n[rnd - 1] = 1; //to indicate which random number is generated
number[n1] = rnd;
System.out.println(number[n1] + " ");
}
取决于你的运气有多糟糕,获得每个价值可能需要很长时间。所以,最好的情况是,你进行两次getnum50()调用,这将在第一次发生,但是当你填满阵列时,它变得越来越不可能。对于100个数字,最后一个数字在第一次成功的可能性为1%,每次失败时,再对getnum50()进行两次调用。
抱歉,这并没有回答如何提高效率,但它确实解释了为什么效率问题。希望它有所帮助。
答案 4 :(得分:0)
你的问题是,如果你在列表的末尾,你将不得不生成大量的随机数,以便在剩下的几个点中得到一个数字。您可以通过以下方式减少一些适合当前答案的方法:
while(n[rnd-1] == 1)
{
rnd++;
rnd=end%101;
}
n[rnd-1]=1;//to indicate which random number is generated
number[n1]=rnd;
System.out.println(number[n1]+" ");
但是,如果你认为getnum50比你可以编写的任何东西都贵,那么你可以减少填充列表后半部分时调用的getnum50的数量。每次找到一个数字时,您可以将搜索空间减少一个(使用非基元):
while(myArrayList.size()>1)
{
int rnd=0;
if(myArrayList.size()>50);
rnd=((getnum50()-1)/50)+((getnum50()*2)%myArrayList.size())+1;
else
rnd=getnum50()%myArrayList.size()+1;
System.out.println(rnd);
myArrayList.remove(rnd);
}
System.out.println(myArrayList.get(rnd);
myArrayList.remove(rnd);
在这个例子中,你最好的,平均的和最差的是149个getnum50电话;