周期を測定するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mkai

周期を測定するプログラム

#1

投稿記事 by mkai » 10年前

いつもお世話になっております。

数列をある規則にそって時間発展させる。
その数列が初期値と一致した時のステップ数を測定する。
と言うプログラムなのですが、初期値と一致していないのにプログラムが止まります。

測定法はこのようにしています

コード:

T=0;
for(t=0;t<step;t++){
	for(i=0;i<2*N;i++){
		a_new[i]=g[p[i]][a[i]];
		p[i+1]=f[p[i]][a[i]];
	}
	p[0]=p[2*N];
	for(i=0;i<2*N;i++) printf("%d ",a[i]);
	printf("\n");
	for(i=0;i<2*N;i++) printf("-");
	printf("\n");
	for(i=0;i<2*N;i++) a[i]=a_new[i];

	s=0;

	for(i=0;i<2*N;i++){
		if(a[i]==b[i]){
			s=s+1;
		}else{
			T=T+1;
			break;
		}
	}
	if(s==2*N) break;
}
初期値はランダムで与えられ、bはaの初期値を格納した数列です。
s=0を格納し、ステップごとにaとbが等しければs=s+1、異なっていればステップ回数T=T+1をしていく。
aが初期値の数列bと全て等しい時s=2*Nとなり、その時このループを脱する。

と言う風にしたのですが…うまくいかず初期値と等しくなくてもループを脱してしまいます。
一体どこがおかしいのでしょうか?

よろしくお願いします。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 周期を測定するプログラム

#2

投稿記事 by usao » 10年前

よくわからないけど,2行目を見るに,3~24行目の処理内容とは関係なしに
いつかはループを抜けるようになっているのではないでしょうか.

mkai

Re: 周期を測定するプログラム

#3

投稿記事 by mkai » 10年前

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

はい。
プログラムはstep数だけ回して途中で初期値と一致する数列になればループを止める
というものなので最長でstep数分だけまわります。(stepはscanfで入力しています)
ところがどういうわけか初期値と一致していないのにループが途中で抜けているんです…

Poco
記事: 161
登録日時: 14年前

Re: 周期を測定するプログラム

#4

投稿記事 by Poco » 10年前

何をもって途中で抜けていると判断したのでしょうか?
提示されたソースだけでは再現できないので、何とも言えないです。
7行目のp[2*N]は領域外アクセス臭いです。
8行目で出力している配列aと17行目で比較している配列aは別物なので、8行目の出力が配列bと異なっても17行目での比較では配列aと配列bが同じである可能性もあります。

mkai

Re: 周期を測定するプログラム

#5

投稿記事 by mkai » 10年前

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

> 何をもって途中で抜けている
例えばstepを30回とした時、10回しかループしてないので途中で抜けていると思っています。

8行目の出力と17行目は意図的に別のものにしています

例えば初期値
01010101
が次のstepで
01011010
になったと。
この時まずは
初期値を出力(8行目)し、その後aに先程更新した数列(01011010)を入れる(12行目)
で12行目で入れなおした数列と初期値の数列bを比較してます
全て同じであればs=8になり、その時stepのループを抜ける
どこかが異なるのであれば(今回の場合、a[4]の値が異なっています)T=T+1をして次のstepへ

と言う感じです

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 周期を測定するプログラム

#6

投稿記事 by usao » 10年前

このコードの直後(ループを抜けたところ)で a[] と t (と,一応b[]やstepも) の値を出力してみたら

t<step となっていて,且つ,a[]の中身がb[]とは異なっている

ということだと思いますが,そういうはっきりとした確認は行っていますか?

mkai

Re: 周期を測定するプログラム

#7

投稿記事 by mkai » 10年前

usaoさん
返信ありがとうございます。
ご指摘を受け、改めてコードを見たところ一致する直前の値までしか出力していませんでした。

その後、24行目にbreakの直前に

コード:

for(i=0;i<2*N;i++) printf("%d ",a[i]);
を入れたところ無事一致しました。

ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る