アプリ版:「スタンプのみでお礼する」機能のリリースについて

大学で卒論のためにFortran90でランダムウォークのプログラムを作ってるんですが…2週間悩んでるんですが、できないところがあります。
「1次元のランダムウォークにおいて、ステップ数Nとxの値を与えたときのすべての可能な歩行を数え上げるプログラムを書け」というものです。
直接ステップ数を書き込んだプログラムを基にして任意のステップ数を入力するプログラムを作ってみたんですが、うまくいきません。
integer :: a(100,20), x, i1, i2, i3
x = 0
do i1 = -1, 1, 2;do i2 = -1, 1, 2;do i3 = -1, 1, 2
x = x + 1
a(x, 1) = i1;a(x, 2) = i2;a(x, 3) = i3
end do;end do;end do
end
が基にしたプログラムです。これはステップ数が'3'なので実行結果は「-1-1-1,-1-11,-11-1,-11-1,-111,1-1-1,11-1,111」というxの変位の仕方が出ます。
integer, allocatable :: a(:,:)
integer :: i, n, x, l
print *, 'ステップ数を入力:'; read *, n
allocate(a(n, 2**n))
do l = 1, n
do i = -1, 1, 2
x = x + 1
a(x, l) = i
end do
end do
end
という風に作ってみたんですが、'3'を入力しても同じ結果が出ません。わかりにくい文章で申し訳ないですがどなたかご教授お願いします。

A 回答 (3件)

元のプログラムを再現するなら


allocate(a(2**n, n))
じゃないかなぁと思うのでこれでいくんだけど, 例えば a(:, 1) は
「最初の 2**(n-1) 個が 1, 次の 2**(n-1) 個が -1」
ですね. で, a(:, 2) は
「2**(n-2) 個ずつ 1 と -1 を繰り返す」
ですね. ということで, a(:, l) は
「2**(n-l) 個ずつ 1 と -1 を繰り返す」
ことになります. つまり,
do l = 1, n
do i = 1, 2**n, 2**(n-l+1)
a(i:i+2**(n-l)-1) = 1
a(i+2**(n-l):i+2**(n-l+1)-1) = -1
end do
end do
で終わり... じゃないかな.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なるほど…
私は根本的に配列について勘違いしていたようです。
そのようにして作ってみます。
たびたびのご回答、ありがとうございました。
また、何かあったらよろしくお願いします。

お礼日時:2007/07/09 10:31

よく考えたら, 「最終的にできるパターン」はわかっているんだよなぁ.


そのパターンができるようにプログラムを作る方が簡単かもしれない.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そうなんです。
最終的にどんなパターンになるかは分かっているんですが…
そのように考えてみます。
アドバイスありがとうございます。
もし具体的にプログラミングがお分かりでしたらまたご教授お願いします。

お礼日時:2007/07/05 10:20

元のプログラムが「3ビットの 2進数を 000 から 1 ずつ増やすこと」と本質的に同じであることに気付けば簡単かな.

    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
「3ビットの2進数を000から1ずつ増やすこと」ですか。
プログラミングは少し苦手でまだいまいちピンときませんが…
さらに質問で申し訳ありませんが、この考えを基にステップ数を3以外にしても可能でしょうか?

お礼日時:2007/07/04 10:36

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