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

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

ただいまの
回答率

90.33%

  • C

    4005questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 289

winglass

score 2

 前提・実現したいこと

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行とします。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sh_akira

    2018/04/26 17:09

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

    キャンセル

  • coco_bauer

    2018/04/26 22:14

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

    キャンセル

  • sh_akira

    2018/04/27 12:14

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

    キャンセル

  • sh_akira

    2018/04/27 14:34

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

    キャンセル

回答 2

checkベストアンサー

0

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

double tpm[23][25] = {
    { 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()
{
    int Ma = 0;
    int Mb = 0;
    double y = 0;

    srand((unsigned int)time(NULL));

    while (Ma <= 23) {
        double x = (double)rand() / RAND_MAX;
        y = 0;
        printf("Ma:%d x:%lf\n", Ma, x);
        for (Mb = 0; Mb < 25; Mb++) {
            y += tpm[Ma][Mb];
            if (x <= y) {
                break;
            }
        }
        Ma = Mb;
        if (Ma >= 24) {
            break;
        }
    }
    printf("End Ma:%d\n", Ma);
    return 0;
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 20:07

    何度もありがとうございます。

    Ma:0 x:0.973938
    Ma:15 x:0.968154
    Ma:23 x:0.760609
    End Ma:25

    上記のような結果が得られました。
    Ma:15の時、次に23を取る値は配列上には存在しないように思うのですが…

    キャンセル

  • 2018/05/09 20:12

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/01 15:53

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

    キャンセル

同じタグがついた質問を見る

  • C

    4005questions

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