从1-100生成随机数

时间:2013-07-19 18:32:03

标签: java random

int getnum50()
{ 
  Random rand = new Random(); 
  return (1+rand.nextInt(50)); 
}    
  • 您将获得一个名为getnum50()的预定义函数,该函数返回一个 整数,是1-50的一个随机数。
  • 您可以根据需要多次调用此功能,但要注意 这个功能非常耗费资源。
  • 您不能使用任何其他随机生成器。你不能改变 getnum50()
  • 的定义

以随机顺序打印数字1-100。 (不是100个随机数)

注意:

  • 我。每个号码都应该打印一次。
  • II。数字列表中应该没有模式。列表应该是 完全随机,即所有数字具有相同的概率 出现在任何地方。
  • III。您可以拨打getnum50()任意数量的时间来获取随机数 从1到50,但尝试使代码优化。
  • IV。除了以外,您不能使用任何其他随机生成器功能 getnum50()。

我写了一些显示正确输出的代码。

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次。在最坏的情况下,它将是无限的,平均情况下数万。他要求我优化代码,以便显着改善平均情况。 我无法回答。所以请给我正确的答案吗?我将如何优化上面的代码?

5 个答案:

答案 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电话;