随机数生成器不工作,超出范围异常?

时间:2016-03-07 21:27:16

标签: java bluej

我刚刚开始使用这个程序编写代码,所以请放轻松。 :)所以我尝试将随机变量添加到一个arraylist,但它们一直出现在0.我想可能是因为它可能没有在列表中添加任何东西?如何在其他类(下面的类)中调用add2array方法?

public class myClass
{
  // instance variables 
  public Random r;
  public Random t;
  public Random o;
  public int randomR;
  public int randomT;
  public int randomO;
  public ArrayList <Integer> myArray;

  /**
   * Constructor for objects of class 
   */
  public myClass()
  {
    r = new Random();
    t = new Random();
    o = new Random();
    int randomR = (r.nextInt(10));
    int randomT = (t.nextInt(10));
    int randomO = (o.nextInt(10));
    myArray = new ArrayList<Integer>();
  }
  public void add2Array()
  {
    myArray.add(randomR); //myArray[0] is first random number
    myArray.add(randomT); //myArray[1] is second random number
    myArray.add(randomO); //myArray[2] is third random number
  }
}

然后在另一个类中有这个代码。我尝试在类中调用printArray,它说有一个超出范围的异常。

public class myClass2
{
  Arraylist<myClass> myArray;


  public myClass2()
  {
    myArray = new ArrayList<myClass>();
  }

  public void printArray()
  {
    System.out.println("Slot 1: " + myArray.get(0));
    System.out.println("Slot 2: " + myArray.get(1));
    System.out.println("Slot 3: " + myArray.get(2));
  } 
}
然后我创建了一个&#34; Main&#34;类。仍然越界出错。它指向printArray方法是myClass2。

public static void main(String[] args) 
{ 
    myClass m = new myClass(); 
    myClass2 k = new myClass2(); 
    m.add2array(); 
    g.printArray(); 
}

4 个答案:

答案 0 :(得分:4)

在构造函数中,您声明了新变量randomRrandomTrandomO,这些变量会影响您现有的同名实例变量。这些实例变量未分配,因此它们的默认值为0。在构造函数中,更改

int randomR = (r.nextInt(10));
int randomT = (t.nextInt(10));
int randomO = (o.nextInt(10));

randomR = (r.nextInt(10));
randomT = (t.nextInt(10));
randomO = (o.nextInt(10));

答案 1 :(得分:1)

我没有看到你在任何地方调用add2Array()方法。获得IndexOutOfBoundsException的原因是由于myArray没有任何元素且代码执行myArray.get(0)

确保更改whate @rgettman建议否则在解决我提到的这个问题后你会得到0。

add2Array()构造函数

调用myClass()

或在另一个班级

myClass m = new myClass();
m.add2Array();
m.printArray();

不确定您要实现的目标,因为代码不是很好。同样在Java中,良好的约定是让类名以大写字母开头。

答案 2 :(得分:0)

使用SecureRandom的Java Random inlace。

使用Java SecureRandom类和方法:nextInt(int n),它在0(包括)和指定值(不包括)之间均匀分布int值。

这是一个加密安全的PRNG,不需要播种。

来自Class SecureRandom

SecureRandomClass Random继承的nextInt方法

答案 3 :(得分:-1)

如果您使用相同的种子调用新的Random(),您将始终得到相同的答案。这是获取伪随机整数的一种方法:

 using System.Security.Cryptography;
 .
 .
 .

 public int Randominteger(int minValue, int maxValue)
 {
      RNGCryptoServiceProvider crypt = new RNGCryptoServiceProvider();
      byte[] fourbytes = new byte[4];
      crypt.GetBytes(fourbytes);
      return new Random(BitConverter.ToInt32(fourbytes, 0)).Next(minValue, maxValue);
 }