現在Javaでランダム生成した最長閉路を描画する課題をやっています。
現在次のようなエラーが返されてどこが間違っているのかが検討つきません...
java.lang.IllegalArgumentException: bound must be positive
at java.util.Random.nextInt(Random.java:388)
at Heiro_ln.init(Heiro_ln.java:20)
at sun.applet.AppletPanel.run(AppletPanel.java:434)
at java.lang.Thread.run(Thread.java:745)
そもそもIlligalArgumentExceptionってどんなエラーなのでしょうか....?
以下にプログラムを載せておきます。
java
1import java.applet.Applet; 2import java.awt.*; 3import java.util.*; 4import java.util.List; 5 6public class Heiro_ln extends Applet{ 7 8 int max = 0; 9 int dis_now; 10 int fact_n = 0; 11 Random rnd = new Random(); 12 int n = rnd.nextInt(3)+2; 13 ArrayList<Point> points = new ArrayList<Point>(); 14 List<List<Integer>> list; 15 16 public void init(){ 17 18 19 for(int i = 0; i < 3*(n+1); i++){ 20 points.add(new Point(rnd.nextInt((int)System.currentTimeMillis()%100) + 10, rnd.nextInt((int)System.currentTimeMillis()%100) +10)); 21 } 22 23 list = nPn(n-1); 24 fact_n = fact(n); 25 longest(0); 26 } 27 28 //描画 29 30 public void paint(Graphics g){ 31 int px[] = new int[n+1]; 32 int py[] = new int[n+1]; 33 34 for(int i = 2*(n+1); i < 3*(n+1); i++){ 35 Point pt = points.get(i); 36 px[i-2*(n+1)] = 5*pt.x; 37 py[i-2*(n+1)] = 5*pt.y; 38 } 39 //座標を描画 40 for(int i = 0; i < n ; i++){ 41 String string_x = String.valueOf(px[i]); 42 String string_y = String.valueOf(py[i]); 43 g.drawString("("+string_x+","+string_y+")", 10+55*i, 10); 44 } 45 g.drawPolyline(px, py, n+1); 46 } 47 48 //距離を求める 49 50 public int distance(){ 51 int toatal_distance = 0; 52 int dis[] = new int[n]; 53 for(int i = n+1; i < (n+1)*2 - 1; i++){ 54 int dx = 0; 55 int dy = 0; 56 Point pt_p = points.get(i); 57 Point pt_a = points.get(i+1); 58 dx = pt_a.x - pt_p.x; 59 dy = pt_a.y - pt_p.y; 60 dis[i-n-1] = (int)Math.sqrt(dx*dx + dy*dy); 61 } 62 for(int j = 0; j < n; j++){ 63 toatal_distance += dis[j]; 64 } 65 return toatal_distance; 66 } 67 68 69 public static List<List<Integer>> nPn(Integer n) { 70 71 if (n == null || n < 0){ 72 return null; 73 } 74 75 List<List<Integer>> Ans = new ArrayList<List<Integer>>(); 76 77 if (n == 0) { 78 Ans.add(new ArrayList<Integer>(Arrays.asList(0))); 79 return Ans; 80 } 81 List<List<Integer>> preAns = nPn(n - 1); 82 83 for (List<Integer> permutation : preAns) { 84 for (int i = 0; i <= n; ++i) { 85 permutation.add(i, n); 86 Ans.add(new ArrayList<Integer>(permutation)); 87 permutation.remove(n); 88 } 89 permutation.clear(); 90 } 91 preAns.clear(); 92 93 return Ans; 94 } 95 96 //階乗計算 97 public int fact(int t){ 98 int result = 1; 99 for(int i = t; i > 0; i--){ 100 result *= i; 101 } 102 return result; 103 } 104 105 106 //最短距離を求める 107 public int longest(int k){ 108 109 110 for(int i = n+1; i < 2*(n+1)-2; i++){ 111 points.set(i, points.get((list.get(k)).get(i-n-1))); 112 } 113 points.set(2*(n+1)-1, points.get((list.get(k)).get(0))); 114 115 dis_now = distance(); 116 if(max == 0){ 117 max = dis_now; 118 }else if(dis_now > max){ 119 max = dis_now; 120 121 for(int i = 2*(n+1); i < 3*(n+1)-2; i++){ 122 points.set(i, points.get((list.get(k)).get(i-2*(n+1)))); 123 } 124 points.set(3*(n+1)-1, points.get((list.get(k)).get(0))); 125 } 126 127 128 if(k < fact_n - 1){ 129 return longest(k+1); 130 }else{ 131 return 0; 132 } 133 } 134} 135
原因がわかる方、よろしくお願いします!

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/04 06:02
2015/08/04 06:13