C言語関係掲示板

過去ログ

No880 乱数を使った千鳥足

[戻る] [ホームページ]
No.11401

乱数を使った千鳥足
投稿者---おだ(2003/12/22 16:59:33)


乱数(0から1)を発生させて、7×7のますに*を足跡を残し、右したのたて3ますに来たら終了するプログラムですが、
右下20%、右15%、下15%、その他は10%の確率で動きます。

7ます以内で動く(はじっこにきたらます外動かない)と、アスタリスクを表示する方法がわかりません。

教えてください。お願いします。

#include<stdio.h>
#include<stdilib.h>
#define RAND()((double)rand()/(32767.0+1.0))
void chido(int *);
main()
{
int a[7][7]={0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0};
int k,l;
chido(a[0]);
for(k=0;k=<7;k++){
for(l=0;l<7;l++){
printf("%d",a[k][l]);
}
printf("\n");
}
void chido(int *p)
{
int m,n=0,o=0;
double ran;
srand((unsigned)time(NULL));
*p=1;
for(m=1;m<100;m++){
ran=RAND();
if(ran<0.2) n++,o++;
else if(ran<0.35) o++;
else if(ran<0.5) n++;
else if(ran<0.6) n--,o++;
else if(ran<0.7) n--;
else if(ran<0.8) n--,o++;
else if(ran<0.9) o--;
else if(ran<1.0) n++,o--;
*(p+7*n+o)=1;
if(*(p+34)=1) break;
if(*(p+41)=1) break;
if(*(p+48)=1) break;
}
}


No.11407

Re:乱数を使った千鳥足
投稿者---NykR(2003/12/22 18:14:08)


細かい間違いがたくさんありますが、とりあえず質問に答えておきます。

>7ます以内で動く(はじっこにきたらます外動かない)と、

少々トリッキーかもしれませんが、真偽値を足すのが簡単だと思います。

#define SIZE 7

として置いて

n += (n < SIZE - 1);

の様に書くと、n < SIZE - 1 (n < 6)が真のとき、この不等式全体の値は1となり
(Cでは式そのものが値を持ちます、例外もありますが)、
nに1加算されます。
偽のとき、この不等式の値は0になるので、nは増えません。


>アスタリスクを表示する方法がわかりません。

if 〜 else(または?:)で場合分けする。
1のとき・・・ *を表示、
0のとき・・・ スペースを表示。

ex)(?:を使った場合)

for (k = 0; k < SIZE; k++) {
    for (l = 0; l < SIZE; l++){
        printf(" %c", a[k][l] ? '*' : ' ');
    }
    puts("");
}


No.11559

Re:乱数を使った千鳥足
投稿者---おだ(2004/01/08 08:40:38)


ありがとうございました。
今日から学校なので、返事が遅れてしまいました。

初心者なので、また、教えていただくことがあると思います。

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

No.11560

すみません
投稿者---おだ(2004/01/08 09:29:21)


>少々トリッキーかもしれませんが、真偽値を足すのが簡単だと思います。
>
>#define SIZE 7
>
>として置いて
>
>n += (n < SIZE - 1);
>
>の様に書くと、n < SIZE - 1 (n < 6)が真のとき、この不等式全体の値は1となり
>(Cでは式そのものが値を持ちます、例外もありますが)、
>nに1加算されます。
>偽のとき、この不等式の値は0になるので、nは増えません。

これは、どこに、どのように入れたらいいのか全くわかりません。
本当に無知で恥ずかしいです。

教えてください。お願いします。

No.11582

Re:すみません
投稿者---くれせ(2004/01/08 19:43:50)


 えと、私もあまり詳しくはないですが助言させていただきます。

 まず、おださんが困っていたのが
> 7ます以内で動く(はじっこにきたらます外動かない)
と言うことでしたね?

 そこで、それに対処するためには、
「通常は加算するけれど、端に来たら加算しないようにする」
必要があったわけです。

 おださんは、ふつうに加算のみを書いていたので、
そこを置き換えればいいと思いますよ。


> n += (n < SIZE - 1);
 ただ、これは、加算の場合のみ、つまり右、下、右下に動いた場合の部分にしか使えません。
 おださんのプログラムを見たところ、上や左にも動くようなので、
その場合の処理も入れ替えないといけませんよ。(つまり減算の場合)