【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】

今、マルチエージェントシミュレーションのプログラムを書いているのですが、すべてのエージェントが同じ行動をしてしまうという現象が起こっていて、原因がわかりません。簡単に書くと、次のようなプログラムになります。
→この質問の回答No1へ

A 回答 (5件)

 なぜ、1.5だと挙動が違うのか、わかりました。



 1.5の Randamクラスのソースを見てみると、コンストラクタは、

public Random() {
 this(++seedUniquifier + System.nanoTime());
}

 こうなっていました。

 この System.nanoTime() メソッドは1.5から導入された物だそうで、ナノ秒単位の計測に使われるようです。
 seedUniquifier は、long型の staticな変数で、これに1を足すことで、万が一、1ナノ秒の間に複数の Randamクラスが new されても、絶対に Seed がかぶらないように工夫されているみたいです。

 たぶん、見てはないのですが、1.4では System.currentTimeMillis() あたりだけを使っているのかもしれませんね。

 1.5で開発して、ちゃんと動くので安心していたら、いざ1.4で動かしてみたら、ダメだったなんて事にもなりかねませんねぇ。
 バージョンに違いって怖いです。
    • good
    • 0
この回答へのお礼

親切にありがとうございます。
参考になりました!
バージョンによって変わるものなんですねぇ。

お礼日時:2005/01/29 22:23

 こんばんは。



 ソースをコンパイルして実行してみましたが、私の環境では、ちゃんとバラバラになりました。
 ちなみにAgent数、Step数ともに3にしています。

step : 0
agentID : 0 action : 0
agentID : 1 action : 2
agentID : 2 action : 0
step : 1
agentID : 0 action : 2
agentID : 1 action : 1
agentID : 2 action : 2
step : 2
agentID : 0 action : 1
agentID : 1 action : 1
agentID : 2 action : 0

 私の環境は Windows XP、JDK 1.5 です。
 どんな環境で実行しましたか?

この回答への補足

返答ありがとうございます。
私の環境は、Windows XP,j2sdk1.4.2だと思います。
eclipse2.1.1を使っています。
どうやら乱数発生時のシードの問題だったようですが、環境によって違うものなのでしょうか。

補足日時:2005/01/28 01:50
    • good
    • 0

new Random();



new Random((new Date()).getTime());
とかすればいいのでは
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
public CAgent() {
  m_rn = new Random((new Date()).getTime());
  try {
    Thread.sleep(1);
  } catch (InterruptedException e) {
  }
}
というコンストラクタを加えたら解決しました!

お礼日時:2005/01/28 01:50

このプログラムは、エージェントをNUM_AGENT個作り、それぞれのエージェントに初期値を与えます。

ステップごとにそれぞれのエージェントは行動をランダムに選択(setActionメソッド)し、値を更新(takeActionメソッド)するというものです。しかし、このプログラムを実行結果は、
step : 1
agentID : 0action : 1
agentID : 1action : 1
(省略)
agentID : 99action : 1
step : 2
agentID : 0action : 0
agentID : 1action : 0
(省略)
agentID : 99action : 0

ステップ単位ではランダムに選択されるのですが、それぞれのステップではすべてのエージェントが同じ行動になってしまっています。
自分では原因が分からないので、どなたか教えてください。それぞれのステップでエージェントが違った行動をとるには、どうすればいいのでしょうか…?
長文すみませんでした…
    • good
    • 0

エージェントクラス


public class CAgent {
  private Random m_rn = new Random();
  private int m_rand;
  private int m_change;
  public int m_value;
  private int m_action;

  public void setAgentState(int num) {
    m_value = 100 * num;
    m_change = 0;
  }

  public void setAction(int i) {
    m_rand = m_rn.nextInt(3);
    m_action = m_rand;
    System.out.println("agentID : " + i + "\t" + "action : " + m_action);
    switch(m_rand) {
      case 0 : m_change = 0; break;
      case 1 : m_change = 1; break;
      case 2 : m_change = -1; break;
    }
  }

  public void takeAction() {
    m_value += m_change;
  }
}

mainクラス
public class Test2 {
  private static final int NUM_AGENT = 100;
  private static final int NUM_STEP = 10;

  public static void main(String[] args) {
    CAgent[] agent = new CAgent[NUM_AGENT];
    for(int i=0;i<NUM_AGENT;i++) {
      agent[i] = new CAgent();
      agent[i].setAgentState(i+1);
    }
    for(int step=0;step<NUM_STEP;step++) {
System.out.println("step : " + step);
      for(int j=0;j<NUM_AGENT;j++) {
        agent[j].setAction(j);
        agent[j].takeAction();
      }
    }
  }
}

→回答No.2へ
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!