ページ 1 / 1
計算式
Posted: 2018年1月24日(水) 19:07
by dshshh
サイコロの確率をそれぞれ決め、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;
}
Re: 計算式
Posted: 2018年1月24日(水) 19:23
by あたっしゅ
課題ですか ? でしたら、課題を、一切略さずに、お願いします。
Re: 計算式
Posted: 2018年1月24日(水) 22:00
by dshshh
インチキなさいころがあり、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;
}
何か修正があったら言ってください。
よろしくお願いします。
Re: 計算式
Posted: 2018年1月24日(水) 22:03
by みけCAT
1/2は5/10なので、{1, 2, 3, 4, 5, 6, 6, 6, 6, 6}から等確率で1個選んで出すようにするといいでしょう。
Re: 計算式
Posted: 2018年1月24日(水) 23:11
by dshshh
今やってる{ 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 2 };でも変わらないと思うのですが
n=rand からどう式を組み立てればいいのかわからないです。
Re: 計算式
Posted: 2018年1月25日(木) 13:34
by Bull
コード:
int loaded[] = { 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 10, 1.0 / 2 };
この配列の定義は必須ですか?
この配列が無意味のは理解できますか?
もし必須でなければ、みけCATさんの配列を使った方が簡単そうです。
もし必須ならば、0以上1未満の乱数を生成して、どの範囲に収まるかを求めればいいと思います。
Re: 計算式
Posted: 2018年1月25日(木) 13:54
by usao
まず「普通のサイコロ(1~6が同じ確率)」であれば問題なく実現できるのでしょうか?
↓できるなら…
(a)1~2が等確率で出る2面サイコロ
(b)1~5が等確率で出る5面サイコロ
も実現できると思うので,この2つを用いた以下の手順で課題文の確率を実現できると思います.
(1) まず,(a)の出目で分岐することで 「1/2の確率で6」を達成.
(2) (1)にて 6にならない側の目 が出た場合には,(b)を用いることで 1~5 のいずれかを結果とする.
Re: 計算式
Posted: 2018年1月25日(木) 16:09
by かずま
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);