計算式

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

計算式

#1

投稿記事 by dshshh » 1年前

サイコロの確率をそれぞれ決め、X回振ったときのサイコロの出目を出すにはどういった式を使えばいいですか???
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int rmax = 1000; // 発生させる乱数の最大値
int nDleng = 20; // サイコロ列の長さ

int loaded[] = { 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 2 };

int main(void) {
int i,j,n;
srand((unsigned)time(NULL)); // 乱数初期化

for (i = 0; i < nDleng; i++) {

n=rand???         ←←←←←←←←← ここの計算式がわからない

printf("(%3d回目 %d)\n", i + 1, n);
}
return 0;
}

アバター
あたっしゅ
記事: 249
登録日時: 9年前
住所: 東京23区
連絡を取る:

Re: 計算式

#2

投稿記事 by あたっしゅ » 1年前

課題ですか ? でしたら、課題を、一切略さずに、お願いします。
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

dshshh

Re: 計算式

#3

投稿記事 by dshshh » 1年前

インチキなさいころがあり、1から5が出る確率が1/10,6は1/2である。x回振ったときのサイコロの出目列を出すプログラムを作成しなさい。
↑これが問題です。

このプログラムは自分で作った


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


int rmax = 1000; // 発生させる乱数の最大値
int nDleng = 20; // サイコロ列の長さ

int loaded[] = { 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 2 };

int main(void) {
int i,j,n;
srand((unsigned)time(NULL)); // 乱数初期化

for (i = 0; i < nDleng; i++) {

n=rand???         ←←←←←←←←← 多分ここにrandを使うサイコロの式が必要と思いました。 

printf("(%3d回目 %d)\n", i + 1, n);
}
return 0;
}

何か修正があったら言ってください。
よろしくお願いします。

アバター
みけCAT
記事: 6224
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 計算式

#4

投稿記事 by みけCAT » 1年前

1/2は5/10なので、{1, 2, 3, 4, 5, 6, 6, 6, 6, 6}から等確率で1個選んで出すようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

dshshh

Re: 計算式

#5

投稿記事 by dshshh » 1年前

今やってる{ 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 2 };でも変わらないと思うのですが
n=rand からどう式を組み立てればいいのかわからないです。

Bull
記事: 135
登録日時: 5年前

Re: 計算式

#6

投稿記事 by Bull » 1年前

コード:

int loaded[] = { 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 2 };
この配列の定義は必須ですか?
この配列が無意味のは理解できますか?

もし必須でなければ、みけCATさんの配列を使った方が簡単そうです。
もし必須ならば、0以上1未満の乱数を生成して、どの範囲に収まるかを求めればいいと思います。

アバター
usao
記事: 1564
登録日時: 6年前

Re: 計算式

#7

投稿記事 by usao » 1年前

まず「普通のサイコロ(1~6が同じ確率)」であれば問題なく実現できるのでしょうか?
 ↓できるなら…
(a)1~2が等確率で出る2面サイコロ
(b)1~5が等確率で出る5面サイコロ
も実現できると思うので,この2つを用いた以下の手順で課題文の確率を実現できると思います.

(1) まず,(a)の出目で分岐することで 「1/2の確率で6」を達成.
(2) (1)にて 6にならない側の目 が出た場合には,(b)を用いることで 1~5 のいずれかを結果とする.

かずま

Re: 計算式

#8

投稿記事 by かずま » 1年前

dshshh さんが書きました:今やってる{ 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 2 };でも変わらないと思うのですが
n=rand からどう式を組み立てればいいのかわからないです。
int loaded[] だと、小数を保持できないので、要素はすべてゼロです。
double にしましょう。n も。

コード:

double loaded[] = { ...

    double n;

        n = rand() % rmax;
        n /= rmax;
        for (j = 0; n > loaded[j]; n -= loaded[j++]) ;
        printf("(%3d回目 %d)\n", i + 1, j + 1);

返信

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