MAS コミュニティ
artisoc質問用掲示板(アーカイブ)
  
質問掲示板は移転しました。新掲示板はこちら

質問 (解決済み)

[artisocモデル] 配列ミスと格納ミス?
質問者: okdさん , 質問日時: 2020/02/05 22:01
以下のようなコードを書いてみたのですが、
配列インデックス(=90)が配列のサイズ(=90)を超えていますと出てしまいます。

エージェントには、Reslutという名の変数を持たせており、
次元数は2にしており、
1次元の配列数は9
2次元の配列数は2にしています。

モデルとしては、
10回クジを引いて、それぞれの結果について
1)何回目のくじで
2)何等賞があたり、
3)効用はいくら獲得できたか
この三つをすべて変数Resultに収納したいと思っています。
それを以下のように書いてみたのですが、
どうにもうまくいっていません。
一つのエラーが、「配列インデックス(=90)が配列のサイズ(=90)を超えています」と出てしまうこと、
もう一つのエラーが、効用がつねに1になってしまうことの二つです。
一つ一つシラミ潰ししながら見ているのですが、
どこが間違っているのかが分からず、ご助言頂ければ幸いでございます。

dim i as integer

for i=0 to 9
if rnd() < 1/2 then //0.5の確率で一等賞が当たるとします。
my.Result(i,0)=i //何回目のクジであるのかを収納します。
my.Result(i,1)=1 //その回に、一等賞が出たことを格納します。
my.Result(i,2)=10 //効用を10得られたことを格納します。
else   //0.5の確率で二等賞が当たります。
my.Result(i,0)=i  
my.Result(i,1)=2
my.Result(i,2)=15*rnd()
end if
next i



▼解決した回答


書かれている通りであれば、単純な間違いかと思います。
変数で定義している配列数とコードのなかで引数で指定している配列が一致していません。
つまり、1次配列に相当するiを0から9まで実行すると、0,1,2,3,4,5,6,7,8,9の10回です。ということは、変数で定義する配列数は9ではく10でなければなりません。
2次配列も同じです。0,1,2なので、変数で定義する配列数は3です。
しらみつぶしに調べる場合は、println()を駆使し、iなどの一時変数も含めてその中身を確認してみることをお薦めします。

回答者: igaguri さん , 回答日時: 2020/02/05 22:43

▼ 全ての回答


書かれている通りであれば、単純な間違いかと思います。
変数で定義している配列数とコードのなかで引数で指定している配列が一致していません。
つまり、1次配列に相当するiを0から9まで実行すると、0,1,2,3,4,5,6,7,8,9の10回です。ということは、変数で定義する配列数は9ではく10でなければなりません。
2次配列も同じです。0,1,2なので、変数で定義する配列数は3です。
しらみつぶしに調べる場合は、println()を駆使し、iなどの一時変数も含めてその中身を確認してみることをお薦めします。

回答者: igaguri さん , 回答日時: 2020/02/05 22:43
たびたび質問にお答え頂き誠に有り難うございます。
本当に助かっております。

ご指摘の通り、配列数を変更したらうまくいきました。
配列の数え方(0から始まる)と、
配列数の指定(1から始まる)をごちゃごちゃにしており、
配列数を9にすれば、10回収まると勘違いしておりました。
ご指摘誠に有り難うございます。

なるほど、Println()を使えば、実際の挙動を
吐き出してもらい、全体の動きを把握することができるのですね!
早速使ってみたいと思います。
プログラミングというかコードを書くこと自体が初めてでして、躓くことが多いのですが、
おかげさまでこの世界の面白さを垣間見ることができております。
重ねて御礼申し上げます。

回答者: okd さん , 回答日時: 2020/02/06 07:21



Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
( 会社情報 情報セキュリティ・個人情報について )