2016-04-17 1 views
-1

私はAnt Colony Simulatorを持っています。これは27×27グリッドで、食品と最高フェロモンレベルを見つけるForager Antクラスがあります。ある範囲内で動きをランダムに生成する必要があります。生成方法ゼロにアクセスせずにリストサイズ内の範囲に基づく乱数

これはので、ここで、非常に大規模なプロジェクトである(それが十分の場合)問題の唯一の方法である:私は次の乱数にアクセスするために必要な場所で右そこ

private GridNode locateHighestPherms() { 
    Random randomNode = new Random(); 
    LinkedList<GridNode> neighborNodeList = gridLocation.getNeighboringNodes(); //a List of Node Objects that keeps track of adjacent nodes 
    LinkedList<GridNode> randomGridNode = new LinkedList<>(); //random destination Node 

    for(Iterator<GridNode> gridNodeIterator = neighborNodeList.iterator(); gridNodeIterator.hasNext();) { 
     GridNode alreadyVisited = gridNodeIterator.next(); 
     if(foragerMoveHistory.contains(alreadyVisited) || !alreadyVisited.isVisible()) { 
      gridNodeIterator.remove(); 
     } 
    } 
    if(neighborNodeList.size() == 0) { 
     neighborNodeList = gridLocation.getNeighboringNodes(); 
    } 
    GridNode nodeWithMostPherms = neighborNodeList.get(0); 

    for(int checkNode = 1; checkNode < neighborNodeList.size(); checkNode++) { 
     if(nodeWithMostPherms.isVisible() && nodeWithMostPherms.getPheromoneUnit() < neighborNodeList.get(checkNode).getPheromoneUnit()) { 
      nodeWithMostPherms = neighborNodeList.get(checkNode); 
     } 
    } 
    for (GridNode neighborNode : neighborNodeList) { 
     if ((neighborNode.getPheromoneUnit() == nodeWithMostPherms.getPheromoneUnit()) && neighborNode.isVisible()) { 
      randomGridNode.add(neighborNode); 
     } 
    } 
    //DEBUGGING 
    //System.out.println(randomGridNode.size()); 
    nodeWithMostPherms = randomGridNode.get(randomNode.nextInt(randomGridNode.size())); 
    //nodeWithMostPherms = randomGridNode.get(RandomInstance.randomNumberGen(1, randomGridNode.size())); 
    return nodeWithMostPherms; 
    } 
} 

^nodeWithMostPhermsへの割り当てがあります。しかし、私が最初にコメントアウトしたコードを試してみると、リストサイズがゼロのときにゼロにアクセスしようとしていたためにクラッシュしていました。

私は自分のRandomInstanceクラスを表示します。それは短いと甘いです:

import java.util.Random; 

public class RandomInstance { 

static int randomNumber; 

public static int randomNumberGen(int lowRange, int highRange) { 

    Random numberGenerator = new Random(); //I would prefer not to have this. 
    randomNumber = numberGenerator.nextInt(highRange - lowRange + 1) + lowRange; 

    /** EXAMPLE FOR REFERENCE 
    * setFoodUnitAmount(RandomInstance.randomNumberGen(500, 1000)); 
    */ 
    return randomNumber; 
    } 
} 

私は自分のランダムなクラスを持っている理由は、乱数の多くのインスタンスが存在するために生成されていることであり、それは私たち自身を作ることが示唆されたので、私たちが持っていません場所のいたるところにjava.util.Randomのインスタンスがたくさんあります。

私はこれを自分のRandomInstanceクラスにどうやって合わせることができるかについて誰も提案していませんか? 私がコメントアウトのコードをしようとすると、それはライン121はIndexOutOfBoundsException

Exception in thread "Thread-0" java.lang.IndexOutOfBoundsException: Index: 8, Size: 8 
at java.util.LinkedList.checkElementIndex(LinkedList.java:555) 
at java.util.LinkedList.get(LinkedList.java:476) 
at ForagerObject.locateHighestPherms(ForagerObject.java:121) 

をスローしますが、上記の問題の割り当てです。

+0

ランダムを使用することができますか?あなたのRandomInstanceクラスの中にjava.util.Randomインスタンス変数を持つのはどうですか? – Warrior

+0

質問のタイトルを読んで、必要なものを手に入れることができます。 –

+0

そのクラスの中に入れても何も問題ありません。私はクラスが存在しなかった状況を指していて、プログラムを通して多くのランドムズを作りました。 – IRGeekSauce

答えて

1

Randomを共有することはできますが、複数のフィールドは共有しないでください。

public class RandomInstance { 
    private final Random random = new Random(); 

    public int nextInt(int min, int max) { 
     return random.nextInt(max - min + 1) + min; 
    } 
} 

ので、あなたはそれを呼び出す

nodeWithMostPherms = randomGridNode.get(randomInstance.nextInt(1, randomGridNode.size()-1)); 

またはあなたがより明確になるだろう直接

nodeWithMostPherms = randomGridNode.get(random.nextInt(randomGridNode.size()-1)+1); 
関連する問題