Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


766 / 13645 ツリー ←次へ | 前へ→

【78443】数字の出てくる確立を変更したいのですが・・・ m 16/9/24(土) 11:35 質問[未読]
【78444】Re:数字の出てくる確立を変更したいのです... γ 16/9/24(土) 12:18 発言[未読]
【78445】Re:数字の出てくる確立を変更したいのです... m 16/9/24(土) 13:01 質問[未読]
【78446】Re:数字の出てくる確立を変更したいのです... γ 16/9/24(土) 13:54 発言[未読]
【78447】Re:数字の出てくる確立を変更したいのです... m 16/9/24(土) 14:27 質問[未読]
【78448】Re:数字の出てくる確立を変更したいのです... m 16/9/24(土) 14:37 質問[未読]
【78449】Re:数字の出てくる確率を変更したいのです... γ 16/9/24(土) 14:53 発言[未読]
【78450】Re:数字の出てくる確率を変更したいのです... m 16/9/24(土) 15:20 質問[未読]
【78451】Re:数字の出てくる確率を変更したいのです... γ 16/9/24(土) 15:55 発言[未読]
【78456】Re:数字の出てくる確率を変更したいのです... γ 16/9/24(土) 19:08 発言[未読]
【78457】Re:数字の出てくる確率を変更したいのです... γ 16/9/24(土) 19:46 発言[未読]
【78458】Re:数字の出てくる確率を変更したいのです... m 16/9/24(土) 22:41 お礼[未読]
【78459】Re:数字の出てくる確率を変更したいのです... m 16/9/24(土) 23:32 お礼[未読]
【78462】Re:数字の出てくる確率を変更したいのです... γ 16/9/25(日) 12:24 発言[未読]
【78463】Re:数字の出てくる確率を変更したいのです... γ 16/9/25(日) 12:26 回答[未読]
【78464】Re:数字の出てくる確率を変更したいのです... m 16/9/25(日) 13:30 お礼[未読]
【78460】Re:数字の出てくる確率を変更したいのです... m 16/9/24(土) 23:56 お礼[未読]

【78443】数字の出てくる確立を変更したいのですが...
質問  m  - 16/9/24(土) 11:35 -

引用なし
パスワード
   こんにちは。
はじめまして。

大学の研究で実験ソフトを用いて急遽プログラムを組んで実験をしないといけなくなり、今必死で勉強をしている、プログラミング初心者の者です。
VBAも初心者のため、わからないことだらけです。


実験課題作成中にわからないことが発生したため、質問させていただいています。


今、SRTT(系列反応時間課題)という実験課題を作成しています。

SRTTというのは、画面上に4つの四角があり、その四角の中に*が「ある決まり」に沿って発生し、*の出てきた位置に対応するボタンを早く・正確に押してもらうという課題です。
「ある決まり」というのは、1〜4までの数字を使ったある系列(例えば、1-4-2-3-4-1-2-3-1-3-2-4)の順番に繰り返し画面に*が現れる、などのように、*が出てくる順序がある法則で決まっている、ということです。


通常のSRTTでは、1つの決まった系列の順序に沿って、繰り返し*が現れるだけなのですが…
今回私が作成しているSRTTは、少し複雑なのです。

まず、決まった順序が2種類あります。

1つは、Aという系列
A:1→2→1→4→3→2→4→1→3→4→2→3

もう1つはBという系列です。
B : 1→2→4→3→1→4→2→1→3→2→3→4

これら2つの系列は、「2つの数字の並び順によって、次に来る数字が決まる」という法則にのっとって決められています。
(例えば、1が来て、次に3が来ると、自動的に次の数字は4となる)

しかし、1→2と来たら、A系列では次は1、B系列では次は4というように、A系列とB系列では、2つの数字の組み合わせの後に来る数字が異なっています。


実験では、
これら2つの異なった系列を決まった確率で交換しながら刺激を提示したいと考えています。

交換できるポイントは3つあります。
4→3と並んだところと、1→4と並んだところと、2→1と並んだところです。

4→3と数字が並んだら、85%の確率で次に2が来てA系列の並び順で刺激を提示し、15%の確率で次に1が来てB系列の並び順で刺激を提示します。

1→4と数字が並んだら、85%の確率で次に3が来てA系列の並び順で刺激を提示し、15%の確率で次に2が来てB系列の並び順で刺激を提示します。

2→1と数字が並んだら、85%の確率で次に4が来てA系列の並び順で刺激を提示し、15%の確率で次に3が来てB系列の並び順で刺激を提示します。


「2つの数字の組み合わせで次が決定する」というプログラムをVBAでやってみて、A系列だけ、B系列だけであれば、うまく動かすことができました。

しかし、2つの系列を決まった確率で交換し、
交換した後は、それぞれの系列の順序に従って数字が選ばれるというプログラムが
どうしてもできません。


指導教官とも相談をしているのですが、
指導教官は、「ずいぶん昔にプログラムやったから、もうやり方忘れちゃった〜。mさん頑張ってよ〜」と話していて、アドバイスがもらえない状況です。


皆さん、お力を貸していただけませんでしょうか。

どうか、よろしくお願いします。


補足です。

エクセルで実験を行うわけではなく、
あくまで刺激を提示する順序をVBAで作成し、その順序で実験用の刺激配置を変更し、実験を行おうと思っています。
よろしくお願いします。

【78444】Re:数字の出てくる確立を変更したいので...
発言  γ  - 16/9/24(土) 12:18 -

引用なし
パスワード
   普通は[0,1)間の一様乱数を発生させて、
それと閾値との大小比較した結果で、
使用する系列を使い分けるということになるのでしょうね。

乱数はVB標準のRnd関数を使うか、
それで不十分ならMTなども使用可能でしょう。

【78445】Re:数字の出てくる確立を変更したいので...
質問  m  - 16/9/24(土) 13:01 -

引用なし
パスワード
   >γ さん

早速の返信、本当にありがとうございます。


すいません。本当に初心者のため
以下の部分が、よくわかりませんでした。

>普通は[0,1)間の一様乱数を発生させて、
>それと閾値との大小比較した結果で、
>使用する系列を使い分けるということになるのでしょうね。


(0, 1)の一様な乱数を作成するというのは、

j = Int(((1 - 0 + 1) * Rnd) + 1)

という式で乱数を作成したらよいのでしょうか?
また、「閾値との大小比較」は、どのように行ったらよいのでしょうか?
また、使用する系列をどのように指定したら良いのでしょうか?


知識がなく本当にすいません汗
また、たくさん質問をしてしまい、本当にすいません。


あと、この刺激の配置は、
以下の論文を参考に作成しようとしています。
(リンクを張ろうと思ったのですが、張ることができなかったので、論文タイトルを掲載しておきます。)

論文タイトル:Implicit Learning as an ability.


全編英語なのですが、こちらの論文のmethodを読んでいただけると
より、どのような刺激を作成したいのかが
伝わりやすいかもしれない…と思いました。
(この論文の5ページ目からmethodが始まり、6ページ目に実験の系列の作成例を示した図が載っています。)


私自身も、いろいろ調べて、頑張ってプログラム組んでみようと思っています。
何卒、よろしくお願いいたします。

【78446】Re:数字の出てくる確立を変更したいので...
発言  γ  - 16/9/24(土) 13:54 -

引用なし
パスワード
   Rnd()は[0,1)の小数を返します。
それと0.85 とを比較して、
0.85以下なら系列Aを選び、そうでなければ系列Bを選ぶ、
このようにすれば、
0.85の確率で系列Aを選び、0.15の確率で系列Bを選ぶことになる。

ところで、
使用系列  A A B B B B
数字   1 2 1 3 2 3 4
ここで行き止まりになりますな。
このあとどうするのですか? これで終わりでよいのですか?

なお、
紹介論文は 有料($39.95)ですね。買って回答して欲しいと?
無料のPDFか何かあるんですか?
HT TPのようにスペースをはさんでurlを書けば問題がないですよ。

【78447】Re:数字の出てくる確立を変更したいので...
質問  m  - 16/9/24(土) 14:27 -

引用なし
パスワード
   >γ さん

返信ありがとうございます。

>Rnd()は[0,1)の小数を返します。
>それと0.85 とを比較して、
>0.85以下なら系列Aを選び、そうでなければ系列Bを選ぶ、
>このようにすれば、
>0.85の確率で系列Aを選び、0.15の確率で系列Bを選ぶことになる。

なるほど!Rndの後に、()だけにすることで、小数を返すことができるのですね!
ありがとうございます!


>ところで、
>使用系列  A A B B B B
>数字   1 2 1 3 2 3 4
>ここで行き止まりになりますな。
>このあとどうするのですか? これで終わりでよいのですか?


どのように説明すればいいのか、とても難しいのですが…

論文に載っていた系列例を見にくいかもしれませんが書いてみます。

1→2→1→4→3→ 1→4→ 3→2→4→1→3→4→2→3→1→2→1→ 3→ 4→2→3→…
{系 列 A } {B} {  系   列    A    }{B}{系列A}


A系列:1→2→1→4→3→2→4→1→3→4→2→3

B系列:1→2→4→3→1→4→2→1→3→2→3→4


4→3と数字が並ぶ度に、A系列に進むか、B系列に進むかを選択し、
どちらかの系列の並び順に入り込み、次の数字が選ばれます。
例えば、上記の系列例で行けば、
4→3と数字が並んだとき、15%の確率で次の数字が1となり、B系列に入ります。
ここで、85%の確率で次の数字に2が選択され、A系列にままとどまる可能性もあります。

B系列に入った後、1→4と数字が並ぶと、またA系列に進むか、B系列に進むか、確率によって選択されます。
上記の系列例では、
1→4と数字が並んだとき、85%の確率で次の数字が3となり、A系列に入ります。
しかし、15%の確率で次の数字が2となり、B系列にとどまる可能性もあります。

つまり、
1→4と数字が並んだとき
4→3と数字が並んだとき
2→1と数字が並んだときは
毎回必ず、どちらの系列に進むかを確率で決定し、
決定した系列の方へ侵入し、
その系列で決まっている並び順(上記のA系列とB系列の順番)に数字が配置されるという法則となっています。


実験の試行としては、
1つの数字で1試行と考え、100回連続して試行続けたいと考えています。
つまり、この法則で100こ数字を並べたいと思っています。


紹介した論文は、PDFが無料でダウンロードできるはずです…
著者は、Scott Barry Kaufamらです。

Scott Barry Kaufam, Colin G. DeYoug, Jeremy R. Gray, Luis Jimenz, Jamie Brown, Nicholas Machintosh. (2010). Implicit learning as an ability. Cognition, 116(2010), 321-340.


なるほどスペースを挟むとURLが載せられるのですね。
ht tp: // sco ttba rryk aufma n.c om/wp-con ten t/u plo ads/2 011/06/ Kau fman-et-al.-20 10. pdf


乱雑にスペースを挟んでいるので、見にくいかもしれません…
慣れないもので、本当にすいません…

また、いろいろとご足労をおかけしてしまって、本当に申し訳ありません。

このように助けていただいて、とても助かっています。

よろしくお願いいたします。

【78448】Re:数字の出てくる確立を変更したいので...
質問  m  - 16/9/24(土) 14:37 -

引用なし
パスワード
   ▼m さん:
>>γ さん
>
>返信ありがとうございます。
>
>>Rnd()は[0,1)の小数を返します。
>>それと0.85 とを比較して、
>>0.85以下なら系列Aを選び、そうでなければ系列Bを選ぶ、
>>このようにすれば、
>>0.85の確率で系列Aを選び、0.15の確率で系列Bを選ぶことになる。
>
>なるほど!Rndの後に、()だけにすることで、小数を返すことができるのですね!
>ありがとうございます!
>
>
>>ところで、
>>使用系列  A A B B B B
>>数字   1 2 1 3 2 3 4
>>ここで行き止まりになりますな。
>>このあとどうするのですか? これで終わりでよいのですか?
>
>
>どのように説明すればいいのか、とても難しいのですが…
>
>論文に載っていた系列例を見にくいかもしれませんが書いてみます。
>
>1→2→1→4→3→ 1→4→ 3→2→4→1→3→4→2→3→1→2→1→ 3→ 4→2→3→…
>{系 列 A } {B} {  系   列    A    }{B}{系列A}
>
>
>A系列:1→2→1→4→3→2→4→1→3→4→2→3
>
>B系列:1→2→4→3→1→4→2→1→3→2→3→4
>
>
>4→3と数字が並ぶ度に、A系列に進むか、B系列に進むかを選択し、
>どちらかの系列の並び順に入り込み、次の数字が選ばれます。
>例えば、上記の系列例で行けば、
>4→3と数字が並んだとき、15%の確率で次の数字が1となり、B系列に入ります。
>ここで、85%の確率で次の数字に2が選択され、A系列にままとどまる可能性もあります。
>
>B系列に入った後、1→4と数字が並ぶと、またA系列に進むか、B系列に進むか、確率によって選択されます。
>上記の系列例では、
>1→4と数字が並んだとき、85%の確率で次の数字が3となり、A系列に入ります。
>しかし、15%の確率で次の数字が2となり、B系列にとどまる可能性もあります。
>
>つまり、
>1→4と数字が並んだとき
>4→3と数字が並んだとき
>2→1と数字が並んだときは
>毎回必ず、どちらの系列に進むかを確率で決定し、
>決定した系列の方へ侵入し、
>その系列で決まっている並び順(上記のA系列とB系列の順番)に数字が配置されるという法則となっています。
>
>
>実験の試行としては、
>1つの数字で1試行と考え、100回連続して試行続けたいと考えています。
>つまり、この法則で100こ数字を並べたいと思っています。
>
>
>紹介した論文は、PDFが無料でダウンロードできるはずです…
>著者は、Scott Barry Kaufamらです。
>
>Scott Barry Kaufam, Colin G. DeYoug, Jeremy R. Gray, Luis Jimenz, Jamie Brown, Nicholas Machintosh. (2010). Implicit learning as an ability. Cognition, 116(2010), 321-340.
>
>
>なるほどスペースを挟むとURLが載せられるのですね。
>ht tp: // sco ttba rryk aufma n.c om/wp-con ten t/u plo ads/2 011/06/ Kau fman-et-al.-20 10. pdf
>
>
>乱雑にスペースを挟んでいるので、見にくいかもしれません…
>慣れないもので、本当にすいません…
>
>また、いろいろとご足労をおかけしてしまって、本当に申し訳ありません。
>
>このように助けていただいて、とても助かっています。
>
>よろしくお願いいたします。

【78449】Re:数字の出てくる確率を変更したいので...
発言  γ  - 16/9/24(土) 14:53 -

引用なし
パスワード
   Getできました。著者のサイトでしたか。
なお、
>なるほどスペースを挟むとURLが載せられるのですね。
スペースはひとつでいいですよ。
普通はhtとtpの間にスペースを入れる方が多いです。


系列の作り方は理解しているつもりです。
手元に作成例もありますので。
確認のためにお聞きしている、
>このあとどうするのですか? これで終わりでよいのですか?
この質問に答えていただいていないです。
その系列というのは単なる説明用例示ということですか?

【78450】Re:数字の出てくる確率を変更したいので...
質問  m  - 16/9/24(土) 15:20 -

引用なし
パスワード
   γ さん

返信ありがとうございます。
論文ダウンロードできたみたいでよかったです。

スペースは1つでよいのですね。
何も知らず、本当にすいません。


>系列の作り方は理解しているつもりです。
>手元に作成例もありますので。
>確認のためにお聞きしている、
>>このあとどうするのですか? これで終わりでよいのですか?
>この質問に答えていただいていないです。
>その系列というのは単なる説明用例示ということですか?


そうですね。この部分にきちんと答えられていなかったですね。

>>このあとどうするのですか? これで終わりでよいのですか?

この後も同じように数字が続いてほしいです。
出来れば数字が100回続いてもらえると助かるなと思っています。


>その系列というのは単なる説明用例示ということですか?

その系列というのは
A系列とB系列という意味でしょうか?
それとも「系列例」ということでしょうか?

系列Aと系列B(12個の数字の並び)は、説明用例示ではなく、実際に実験にて使用したい系列の並び方です。

「系列例」は、論文の図中に載っていた例を載せたものです。なので、こちらは系列の作成の仕方などを説明した説明用例示と思われます。
(曖昧なお返事で本当にすいません。)


あと、説明が足りていない部分があるかもしれないので
いくつか捕捉をしておきます。


A系列もB系列も

A:1→2→1→4→3→2→4→1→3→4→2→3

B:1→2→4→3→1→4→2→1→3→2→3→4

これで系列が終わりというわけではなく、
通常のSRTではそれぞれの系列が100回続くような感じで実験が組み立てられています。

なので、
A系列は
1→2→1→4→3→2→4→1→3→4→2→3→1→2→1→4→3→2→4→1→3→4→2→3→1→2→1→4→3→2→4→1→3→4→2→3…

と、12個の同じ数字の並びが100回繰り返されます。

B系列も同様です。

今回、100回試行のうち、
85%でA系列が選択され、15%の確率でB系列が選択されるので、
100回のうちA系列の数字が85回、B系列の数字が15回現れればよいのではないかと思っています。
(あくまで、論文を読んだ私の解釈なので、きちんとしたことは、指導教員に確認しないといけないかもしれませんが…。すいません)

すいません。無駄な捕捉だったかもしれないです…。


また、何かありましたら教えてください。できる限り頑張って伝えられるように努力して返信しますので。


何度もお手数をおかけしてしまって、本当に申し訳ありません。

よろしくお願いいたします。

【78451】Re:数字の出てくる確率を変更したいので...
発言  γ  - 16/9/24(土) 15:55 -

引用なし
パスワード
   > なるほど!Rndの後に、()だけにすることで、小数を返すことができるのですね!
カッコの有無で小数になったり整数になったりということはありません。
0と1の間の一様分布という意味をよく考えましょう。

ループ系列とはひと言も書いてなかったですよね。
系列A : "1→2→1→4→3→2→4→1→3→4→2→3→1→2"
系列B : "1→2→4→3→1→4→2→1→3→2→3→4→1→2"
とでも記述すべきでしょう。(最後のところに注目してください。)

> 今回、100回試行のうち、
> 85%でA系列が選択され、15%の確率でB系列が選択されるので、
> 100回のうちA系列の数字が85回、B系列の数字が15回現れればよいのではないかと思っています。
 そう簡単なことでもなく、混在するんじゃないかと思いますが。(それはさておく)

> 指導教官とも相談をしているのですが、
> 指導教官は、「ずいぶん昔にプログラムやったから、もうやり方忘れちゃった〜。mさん頑張ってよ〜」と話していて、アドバイスがもらえない状況です。

それは、そこがあなたの仕事だよ、とおっしゃっているんじゃないですか?
どうですか。ヒントを元に少し考えますか?
すぐに回答を書くこともできるけれど、あなたのためにならないような気もする。
悩む。

【78456】Re:数字の出てくる確率を変更したいので...
発言  γ  - 16/9/24(土) 19:08 -

引用なし
パスワード
   >「2つの数字の組み合わせで次が決定する」というプログラムをVBAでやってみて、
>A系列だけ、B系列だけであれば、うまく動かすことができました。
これの提示をお願いします。

それに追加する形で回答しようと思います。

【78457】Re:数字の出てくる確率を変更したいので...
発言  γ  - 16/9/24(土) 19:46 -

引用なし
パスワード
   時間がとれなくなったので、こちらのものをそちらで加工してください。

Sub test()
  Dim s1 As String: s1 = "1→2→1→4→3→2→4→1→3→4→2→3→1→2"
  Dim s2 As String: s2 = "1→2→4→3→1→4→2→1→3→2→3→4→1→2"
  
  Dim dic1 As Object
  Dim dic2 As Object
  Dim dic As Object
  
  Dim j  As Long
  Dim k  As Long
  Dim ss As String
  Dim s  As String
 
  Columns("A:A").NumberFormatLocal = "@"
  
  Set dic1 = CreateObject("Scripting.Dictionary")
  Set dic2 = CreateObject("Scripting.Dictionary")
  
  s1 = Replace(s1, "→", "")
  s2 = Replace(s2, "→", "")
  
  For k = 1 To Len(s1) - 2
    dic1(Mid(s1, k, 2)) = Mid(s1, k + 2, 1)
    dic2(Mid(s2, k, 2)) = Mid(s2, k + 2, 1)
  Next
  ' このDictionaryというのは、"12"→"1","21"→"4","14"→ "3" 、・・・のような、
  ' 直前二つの数値に対応する次の数値の組み合わせを管理するもので、
  ' dic1("12") とすると "1" が返るようなデータ構造です。
    
  For j = 1 To 10         'トライアルの数
  
    ss = "12"          '作成文字列(固定の文字列を指定)
    Set dic = dic1       'スタートは系列Aで。
    
    'ランダムな位置からスタート
    'If WorksheetFunction.RandBetween(1, 2) = 1 Then
    '  Set dic = dic1
    '  ss = Mid(s1, WorksheetFunction.RandBetween(1, 12), 2)
    'Else
    '  Set dic = dic2
    '  ss = Mid(s2, WorksheetFunction.RandBetween(1, 12), 2)
    'End If
  
    For k = 1 To 100 - 2    '100 個からなる数字作成のため繰り返し
      s = Right(ss, 2)
      If s = "43" Or s = "14" Or s = "21" Then ' regime switching
        If whichSequence(0.85) = 1 Then
          Set dic = dic1
        Else
          Set dic = dic2
        End If
      End If
      ss = ss & dic(s)  '次の数字を連結する
    Next
    
    '結果出力
    Cells(j, 1).Value = ss
  Next
  
  Columns("A:A").EntireColumn.AutoFit

End Sub
Function whichSequence(v As Double) As Long
  If Rnd < v Then
    whichSequence = 1
  Else
    whichSequence = 2
  End If
End Function

【78458】Re:数字の出てくる確率を変更したいので...
お礼  m  - 16/9/24(土) 22:41 -

引用なし
パスワード
   γ さん

返信ありがとうございます。
すいません。バイト中だったのでずっと返信できずにいました。申し訳ございません。


プログラムをここまで組んでいただいていたんですね!
本当にありがとうございます!


まだVBAを始めて1週間の私なので、
加工がうまくできるかわかりませんが、頑張ってやってみます!


至らないところや、言葉の足りないことなどが多々あり、
大変ご迷惑をおかけしました。


11月までには実験に取り掛かれるようにしたかったので
本当に助かりました。


自分で加工する中で、わからないところなどあれば、また相談させていただければ…と思っています。


本当にありがとうございます!!

【78459】Re:数字の出てくる確率を変更したいので...
お礼  m  - 16/9/24(土) 23:32 -

引用なし
パスワード
   γ さん


一番大切な系列がループするという条件を書き忘れていて、
本当に申し訳ありませんでした。
伝えないといけないことがたくさんあり、何を伝えたか、伝えられていないかきちんと把握できておらず、軽くパニックになってしまっていました。


ちなみになのですが、
一応以下のようなプログラムを組んでみていました。

ですが、A系列のみ、B系列のみの刺激提示しかできず、
ここで止まってしまっていました。

また、今動かしてみたところ、
どちらも途中で数字が止まってしまっていたので、
どこか間違えているところがあるのかもしれません。


本当にたくさんご足労をおかけしました。
いろいろと丁寧に対応していただき、本当にありがとうございました!


Sub 配列A()

Dim i As Integer
Dim j As Integer
Dim n As Integer
Dim m As Integer


For i = 1 To 2

j = Int(((4 - 1 + 1) * Rnd) + 1)

If i = 2 Then

Do While Cells(i - 1, 1).Value = j
j = Int(((4 - 1 + 1) * Rnd) + 1)
Loop

End If
Cells(i, 1).Value = j

Next i


For n = 3 To 24

If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 2) Then
Cells(n, 1).Value = 4
End If


If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 4) Then
Cells(n, 1).Value = 2
End If

If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 1) Then
Cells(n, 1).Value = 3
End If

If (Cells(n - 2, 1).Value = 1) And (Cells(n - 1, 1).Value = 2) Then
Cells(n, 1).Value = 1
End If

If (Cells(n - 2, 1).Value = 2) And (Cells(n - 1, 1).Value = 4) Then
Cells(n, 1).Value = 1
End If

If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 3) Then
Cells(n, 1).Value = 2
End If

If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 1) Then
Cells(n, 1).Value = 2
End If

If (Cells(n - 2, 1).Value = 1) And (Cells(n - 1, 1).Value = 4) Then
Cells(n, 1).Value = 3
End If

If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 2) Then
Cells(n, 1).Value = 3
End If

If (Cells(n - 2, 1).Value = 2) And (Cells(n - 1, 1).Value = 1) Then
Cells(n, 1).Value = 4
End If

If (Cells(n - 2, 1).Value = 1) And (Cells(n - 1, 1).Value = 3) Then
Cells(n, 1).Value = 4
End If

Next n


End Sub


Sub 配列B()

Dim i As Integer
Dim j As Integer
Dim n As Integer
Dim m As Integer


For i = 1 To 2

j = Int(((4 - 1 + 1) * Rnd) + 1)

If i = 2 Then

Do While Cells(i - 1, 1).Value = j
j = Int(((4 - 1 + 1) * Rnd) + 1)
Loop

End If
Cells(i, 1).Value = j

Next i


For n = 3 To 24

If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 2) Then
Cells(n, 1).Value = 3
End If

If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 4) Then
Cells(n, 1).Value = 1
End If

If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 1) Then
Cells(n, 1).Value = 2
End If

If (Cells(n - 2, 1).Value = 1) And (Cells(n - 1, 1).Value = 2) Then
Cells(n, 1).Value = 4
End If

If (Cells(n - 2, 1).Value = 2) And (Cells(n - 1, 1).Value = 4) Then
Cells(n, 1).Value = 3
End If

If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 3) Then
Cells(n, 1).Value = 1
End If

If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 1) Then
Cells(n, 1).Value = 4
End If

If (Cells(n - 2, 1).Value = 1) And (Cells(n - 1, 1).Value = 4) Then
Cells(n, 1).Value = 2
End If

If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 2) Then
Cells(n, 1).Value = 1
End If

If (Cells(n - 2, 1).Value = 2) And (Cells(n - 1, 1).Value = 1) Then
Cells(n, 1).Value = 3
End If

If (Cells(n - 2, 1).Value = 2) And (Cells(n - 1, 1).Value = 3) Then
Cells(n, 1).Value = 3
End If

Next n


End Sub

【78460】Re:数字の出てくる確率を変更したいので...
お礼  m  - 16/9/24(土) 23:56 -

引用なし
パスワード
   γ さん


載せていただいていたプログラムを
動かしてみました。

私が思っていた通りの数字の配列になっており大変驚きました。

本当にありがとうございました。

また、
ランダムな位置からスタートバージョンも作成していただいていて、
本当にありがとうございました。

論文の内容を確認したところ、「スタートはランダムな数字から」と書かれていたので、ランダムスタートバージョンを使用させていただきたいと思います。

本当に何から何まで…

感謝の言葉が思いつきません…


本当にありがとうございました。

【78462】Re:数字の出てくる確率を変更したいので...
発言  γ  - 16/9/25(日) 12:24 -

引用なし
パスワード
   少し時間ができましたので、コメントしておきます。

まずはインデントをしっかりつけることをお勧めします。
理解しやすさ、デバッグのしやすさが断然違うはずです。

Sub 配列A()
  Dim i As Integer
  Dim j As Integer
  Dim n As Integer
  Dim m As Integer

  For i = 1 To 2
    j = Int(((4 - 1 + 1) * Rnd) + 1)
    If i = 2 Then
      Do While Cells(i - 1, 1).Value = j
        j = Int(((4 - 1 + 1) * Rnd) + 1)
      Loop
    End If
    Cells(i, 1).Value = j
  Next i

  For n = 3 To 24
    If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 2) Then
      Cells(n, 1).Value = 4
    End If
    If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 4) Then
      Cells(n, 1).Value = 2
    End If

    If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 1) Then
      Cells(n, 1).Value = 3
    End If

    If (Cells(n - 2, 1).Value = 1) And (Cells(n - 1, 1).Value = 2) Then
      Cells(n, 1).Value = 1
    End If

    If (Cells(n - 2, 1).Value = 2) And (Cells(n - 1, 1).Value = 4) Then
      Cells(n, 1).Value = 1
    End If

    If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 3) Then
      Cells(n, 1).Value = 2
    End If

    If (Cells(n - 2, 1).Value = 3) And (Cells(n - 1, 1).Value = 1) Then
      Cells(n, 1).Value = 2
    End If

    If (Cells(n - 2, 1).Value = 1) And (Cells(n - 1, 1).Value = 4) Then
      Cells(n, 1).Value = 3
    End If

    If (Cells(n - 2, 1).Value = 4) And (Cells(n - 1, 1).Value = 2) Then
      Cells(n, 1).Value = 3
    End If

    If (Cells(n - 2, 1).Value = 2) And (Cells(n - 1, 1).Value = 1) Then
      Cells(n, 1).Value = 4
    End If

    If (Cells(n - 2, 1).Value = 1) And (Cells(n - 1, 1).Value = 3) Then
      Cells(n, 1).Value = 4
    End If
  Next n
End Sub

結果が得られることが最大の目的ですので、これはこれでよいのですが、
細かいことを申し上げれば、次の2点が浮かびます。

(1)Cells(n - 2, 1).Value とCells(n - 1, 1).Valueがたくさん出てきて見にくいです。
  Don't Repeat Yourself(同じ事を繰り返すな)ということを言いますが、
  例えば、変数でいったん受けてから、判定をすれば、もっと見やすくなるでしょう。

    a = Cells(n - 2, 1).Value
    b = Cells(n - 1, 1).Value
    If a = 3 And b = 2 Then Cells(n, 1).Value = 4
    If a = 3 And b = 4 Then Cells(n, 1).Value = 2
    ・・・・・
 
(2)マッチしたとしても、その後も続けて最後まで判定するので無駄です。
  なにか工夫が必要でしょう。

次の投稿を見て参考にしてください。

【78463】Re:数字の出てくる確率を変更したいので...
回答  γ  - 16/9/25(日) 12:26 -

引用なし
パスワード
   Dictionaryを使わない版も示しておきましょう。
たぶん、こちらのほうが理解し易いでしょうし、
追加の加工もし易いはずです。

Option Explicit

Sub test()     ' 繰り返し判定版
  Dim i As Long
  Dim j As Long
  Dim n As Long
  Dim m As Long
  Dim a As Long
  Dim b As Long
  Dim k As Long
  Dim seq As Long
    
  Range("A1").CurrentRegion.Clear
  
  For k = 1 To 50
    '最初の二つをランダムにセット(そのままにしてあります)
    For i = 1 To 2
      j = Int(((4 - 1 + 1) * Rnd) + 1)
      If i = 2 Then
        Do While Cells(i - 1, k).Value = j
          j = Int(((4 - 1 + 1) * Rnd) + 1)
        Loop
      End If
      Cells(i, k).Value = j
    Next i
    
    '使用する系列
    seq = WorksheetFunction.RandBetween(1, 2)

    For n = 3 To 100
      a = Cells(n - 2, k).Value
      b = Cells(n - 1, k).Value
      
      ' 特定の組み合わせのとき、系列を再検討
      If (a = 4 And b = 3) Or (a = 1 And b = 4) Or (a = 2 And b = 1) Then
        seq = whichSequence(0.85)
      End If
      
      '次の数値を得る
      If seq = 1 Then
        Cells(n, k).Value = nextByA(a, b)
      Else
        Cells(n, k).Value = nextByB(a, b)
        Cells(n, k).Interior.Color = 15773696  '背景色をつけました
      End If
    Next n
  Next k

End Sub
Function whichSequence(v As Double) As Long
  If Rnd < v Then
    whichSequence = 1
  Else
    whichSequence = 2
  End If
End Function

Function nextByA(a As Long, b As Long) As Long
  Select Case True
    Case a = 3 And b = 2: nextByA = 4
    Case a = 3 And b = 4: nextByA = 2
    Case a = 4 And b = 1: nextByA = 3
    Case a = 1 And b = 2: nextByA = 1
    Case a = 2 And b = 4: nextByA = 1
    Case a = 4 And b = 3: nextByA = 2
    Case a = 3 And b = 1: nextByA = 2
    Case a = 1 And b = 4: nextByA = 3
    Case a = 4 And b = 2: nextByA = 3
    Case a = 2 And b = 1: nextByA = 4
    Case a = 1 And b = 3: nextByA = 4
    Case a = 2 And b = 3: nextByA = 1 '■追加
  End Select
End Function

Function nextByB(a As Long, b As Long) As Long
  Select Case True
    Case a = 3 And b = 2: nextByB = 3
    Case a = 3 And b = 4: nextByB = 1
    Case a = 4 And b = 1: nextByB = 2
    Case a = 1 And b = 2: nextByB = 4
    Case a = 2 And b = 4: nextByB = 3
    Case a = 4 And b = 3: nextByB = 1
    Case a = 3 And b = 1: nextByB = 4
    Case a = 1 And b = 4: nextByB = 2
    Case a = 4 And b = 2: nextByB = 1
    Case a = 2 And b = 1: nextByB = 3
    Case a = 2 And b = 3: nextByB = 4 '■修正
    Case a = 1 And b = 3: nextByB = 2 '■追加
  End Select
End Function

【78464】Re:数字の出てくる確率を変更したいので...
お礼  m  - 16/9/25(日) 13:30 -

引用なし
パスワード
   γ さん:

返信ありがとうございます。
2つの投稿とも読ませていただきました。

>まずはインデントをしっかりつけることをお勧めします。
>理解しやすさ、デバッグのしやすさが断然違うはずです。

なるほど。そうですね!
インデントするのが面倒だなぁと思っていたのですが
インデントしてある方が見やすいですね。
次からはきちんとインデントするようにします。


>結果が得られることが最大の目的ですので、これはこれでよいのですが、
>細かいことを申し上げれば、次の2点が浮かびます。
>
>(1)Cells(n - 2, 1).Value とCells(n - 1, 1).Valueがたくさん出てきて見にくいです。
>  Don't Repeat Yourself(同じ事を繰り返すな)ということを言いますが、
>  例えば、変数でいったん受けてから、判定をすれば、もっと見やすくなるでしょう。
>
>    a = Cells(n - 2, 1).Value
>    b = Cells(n - 1, 1).Value
>    If a = 3 And b = 2 Then Cells(n, 1).Value = 4
>    If a = 3 And b = 4 Then Cells(n, 1).Value = 2
>    ・・・・・

私自身も、
同じのばっかりで見にくいなぁと思っていました。
なるほど、そういう風に変数に代入してしまうと、すっきりして見やすくなるのですね!

 
>(2)マッチしたとしても、その後も続けて最後まで判定するので無駄です。
>  なにか工夫が必要でしょう。

そうなのです。
でも、今の私では、これが精一杯でした…。
どのように改善したらいいのか、今後VBAを勉強して、調べたいと思います。


>Dictionaryを使わない版も示しておきましょう。
>たぶん、こちらのほうが理解し易いでしょうし、
>追加の加工もし易いはずです。


わざわざDictionaryを使わないバージョンまで作っていただいて…
本当にありがとうございます!
そうですね。私としては、Dictionaryを使わない方が
どんなふうにプログラムが組まれているのか見やすいなと思いました!


なにからなにまで、
本当にありがとうございました。

766 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free