読者です 読者をやめる 読者になる 読者になる

ランダマイズ

Processing 3 刺激提示 注意

 心理学実験では,刺激をランダムに呈示することが多い。そのためには,ランダムな順に配列を並び変える必要がある。例えば,刺激が刺激番号1〜5まである場合,参加者ごとに”5, 2, 3, 1, 4"などのランダム順で提示するという具合。プログラム言語によっては,ランダム配列を作成する関数が用意されている場合がある。例えば,Matlabではrandperm関数がある。Processingにはそのような関数はないので,一般的なプログラム言語でもよく使われる並び変える手法を使う。

//1〜5の配列を作成
int learningOrder [] = {1, 2, 3, 4, 5} ; 
//ランダム並び変える変数
int temp, rd, i; 

 for (int i = learningOrder.length-1; i >= 0; i--)
 {
   //random (x, y)でxからyの間で1つの数字をランダムに選択
   tmp = learningOrder[rd];
   rd = (int)random(0,i); 
   learningOrder[rd] = learningOrder[i];
   learningOrder[i] = tmp;
 }

 慣れないとわかりにくいが,learningOrderには1〜5の数字が1〜5番目にそれぞれ格納されている。そこで,一番大きい番目にある数字(5番目にある5)を他の場目にある数字(ランダムに決める番目)と入れ替えるというのをまず行う。Processingは0オリジンなので,5番目は[4]となる。ランダムな番目を選ぶため,まず,rdに1〜4番目のどれかをランダムに選ぶ。rd = (int)random(0, i)の部分がここにあたる。そして,ランダムな番目の数字を一時的にtempに格納する。そして,ランダムな番目に5番目のある数字を入れる。そして,最後に5番目にtempに格納されているランダムな番目の数字を入れる。を5番目,4番目,3番目,2番目,1番目とforループで実施していく。

 順番を並び変えるので,learningOrderのあたる配列の中身は自由である。注意実験では注視点の提示時間を固定すると,注視点提示直後に合わせて注意資源の投入が行われるため,練習効果(課題後半により成績が上がる)が顕著になる可能性がある。それを防ぐために,注視点をランダムに提示すると良い。以下のように,注視点の提示時間を5種類からランダムに並べ,毎試行でランダムに並び替えた配列の1番目を使うようにすればよい。

int fixationTime [] = {100, 200, 500, 1000, 1500} ; 
int temp, rd, i;

for (int i = fixationTime.length-1; i >= 0; i--)
{
  rd = (int)random(0,i);
  tmp = fixationTime[rd];
  fixationTime[rd] = fixationTime[i];
  fixationTime[i] = tmp;
}

 数字だけでなく,文字も並び変えることができる。文字の場合,tmepもString型にしないといけないが,並び変えたい変数によって並び変えのコードの型を毎回変更するのも面倒である。そこで,提示する文字配列(targetWords)の提示順をpresentOrderとして作成し,presentOrderをランダムな配列にすることで,targetWordsをランダムに提示する。

//文字刺激を配列に格納
String targetWords [] = {"one", "two", "three", "four", "five"} ; 

//提示順の変数
int presentOrder [] = new int [5]

int temp, rd, i; 

//提示順に0〜4をいれる
for (int i = 0; i < presentOrder.length; i++)
{
   presentOrder[i] = i;
}

 for (int i = presentOrder.length-1; i >= 0; i--)
 {
   tmp = presentOrder[rd];
   rd = (int)random(0,i); 
   presentOrder[rd] = presentOrder[i];
   presentOrder[i] = tmp;
 }

// targetWordsにあるpresentOrder[i]番目の単語を提示
text (targetWords[presentOrder[i]], width/2, height/2);