質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

286閲覧

C言語 多次元配列に記載の確率を実行

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2018/04/26 07:15

編集2018/05/01 04:58

前提・実現したいこと

x=乱数として、

配列上の確率に応じたaの行動に対してbの行動をする。そのbの行動を新しいaとして格納し、bの行動をする。というのを繰り返したいです。
配列上の24列25列の確率が発生した時に、そのループを抜け出したいです。

プログラミング初心者です。お手柔らかにお願いします。

発生している問題・エラーメッセージ

1、確率を記載した25行25列多次元配列をコード上に載せる

2、配列からデータを取り入れる

3、確率に応じた行動(0〜23列に記載の確率ではループ、24、25列に記載の確率ではループを抜けだす)を行わせる

該当のソースコード

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int tpm[22][24] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.5, 0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0.05, 0.25, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0.1, 0.2, 0.3, 0.1, 0, 0, 0, 0, 0, 0.1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.25, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.6, 0.3, 0, 0, 0, 0, 0.1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.5, 0.2, 0, 0, 0, 0, 0, 0, 0, 0.2, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.3, 0, 0, 0, 0.2},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 0.6, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.3, 0.5, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.05, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0.3, 0.2},
{0, 0, 0.4, 0, 0.2, 0.4, 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.5, 0.5, 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.5, 0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0},
{0, 0, 0, 0, 0.2, 0, 0.2, 0, 0.2, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2},
{0, 0, 0, 0, 0, 0, 0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0.3},
{0, 0, 0, 0, 0, 0.1, 0, 0.3, 0, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0},
{0, 0, 0, 0, 1, 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.1, 0.3, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0.2},
{0, 0, 0.1, 0.1, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0},
{0, 0, 0.3, 0.1, 0.1, 0.1, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2},
{0, 0, 0.3, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1}};

int main {

for(i=0;i<2;i++) { x = (double)rand()/RAND_MAX; Ma = 0; Mb = 0; for (j = 1; (x <= Ma) || (Mb < x); j++) { Ma = Mb; Mb = ; /*ここに新しいbの行動*/

         

補足情報(FW/ツールのバージョンなど)

行列を記載したいのですが、その場合は2次元配列でよろしいのでしょうか?

また、0〜23列の確率ではaに対してbの行動をとり、そのbを新たなaとして格納するという考えです。24、25列では、ループを抜け出すということです。

説明が下手ですみません。行動という表現には語弊がありました。

確率をPとすると
行に記載されている確率は0 <= P <= 1で、同じ行を全て足すと1になるとします。
a(0行X列)の確率を実行すると、次は、b(X行Y列)とします。

0行X列の次はX行Y列、その次はY行Z列、その次は…というように確率で繰り返していき、24、25列の確率を引き当てるまでループするという考えです。

遅くなってしまい申し訳ありません。
スタートは0行or1行、12or13行とします。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sh_akira

2018/04/26 08:09

プログラミング以前に日本語が良く分かりません。まずは「c 多次元配列 初期化」とかで検索して問題1をご自身で試して、間違っていてもいいので自分なりに書いてみてください。一番意味が分からないのは24,25列の確率でループを抜け出すという部分です。これは逆に言えば確率でループを抜け出さない可能性もあるという事ですか?その場合何が起きるんでしょう。ちょっと分からないです。
coco_bauer

2018/04/26 13:14

「25行25列多次元配列」って、25x25の2次元配列ではないのですか? 3次元以上に多次元配列になるのなら、その理由と構成方法を説明してください。
sh_akira

2018/04/27 03:14

ただ行列を書くだけなら2次元配列で良いでしょう。「bの行動」ってなんでしょうか。何か計算式を入れるんですか?
sh_akira

2018/04/27 05:34

何となくわかりましたが、25x25の定義を書くのは面倒なので、ご自身で書いてみてください。それから、24列目と25列目の時はループから抜けるのであれば、24,25行目はいらないですよね?23行25列で良いのではないでしょうか?
guest

回答2

0

ベストアンサー

c

1#include <stdio.h> 2#include <time.h> 3#include <stdlib.h> 4 5double tpm[23][25] = { 6 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.5, 0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0.05, 0.25, 0, 0, 0, 0, 0, 0, 0 }, 8 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1, 0.1, 0.2, 0.3, 0.1, 0, 0, 0, 0, 0, 0.1 }, 9 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.25, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, 10 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.6, 0.3, 0, 0, 0, 0, 0.1/*, 0*/ }, 11 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.5, 0.2, 0, 0, 0, 0, 0, 0, 0, 0.2, 0 }, 13 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.3, 0, 0, 0, 0.2 }, 14 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 0.6, 0 }, 15 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.3, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 16 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.05, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1 }, 18 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0.3, 0.2 }, 19 { 0, 0, 0.4, 0, 0.2, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 { 0, 0, 0, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0 }, 22 { 0, 0, 0, 0, 0.2, 0, 0.2, 0, 0.2, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2 }, 23 { 0, 0, 0, 0, 0, 0, 0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0.3 }, 24 { 0, 0, 0, 0, 0, 0.1, 0, 0.3, 0, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0 }, 25 { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 26 { 0, 0, 0, 0, 0, 0.1, 0.3, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0.2 }, 27 { 0, 0, 0.1, 0.1, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0 }, 28 { 0, 0, 0.3, 0.1, 0.1, 0.1, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2 }, 29 /*{ 0, 0, 0.3, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.1 }*/ 30}; 31 32int main() 33{ 34 int Ma = 0; 35 int Mb = 0; 36 double y = 0; 37 38 srand((unsigned int)time(NULL)); 39 40 while (Ma <= 23) { 41 double x = (double)rand() / RAND_MAX; 42 y = 0; 43 printf("Ma:%d x:%lf\n", Ma, x); 44 for (Mb = 0; Mb < 25; Mb++) { 45 y += tpm[Ma][Mb]; 46 if (x <= y) { 47 break; 48 } 49 } 50 Ma = Mb; 51 if (Ma >= 24) { 52 break; 53 } 54 } 55 printf("End Ma:%d\n", Ma); 56 return 0; 57}

つまりこういう事でしょうか。
列数と行数が一部正しくないのでこちらで適当に修正しました

投稿2018/05/08 03:32

sh_akira

総合スコア380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/09 11:07

何度もありがとうございます。 Ma:0 x:0.973938 Ma:15 x:0.968154 Ma:23 x:0.760609 End Ma:25 上記のような結果が得られました。 Ma:15の時、次に23を取る値は配列上には存在しないように思うのですが…
sh_akira

2018/05/09 11:12

配列は1からではなく0から数えます
guest

0

推移確率行列のおハナシなのかしら...
ページランクのアルゴリズムが参考になるかも。

投稿2018/04/27 12:34

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/01 06:53

そうです!推移確率行列です。 リンクのページ参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問