計算式

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

計算式

#1

投稿記事 by dshshh » 6年前

サイコロの確率をそれぞれ決め、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;
}

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

Re: 計算式

#2

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

課題ですか ? でしたら、課題を、一切略さずに、お願いします。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

dshshh

Re: 計算式

#3

投稿記事 by dshshh » 6年前

インチキなさいころがあり、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
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 計算式

#4

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

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

dshshh

Re: 計算式

#5

投稿記事 by dshshh » 6年前

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

Bull
記事: 149
登録日時: 9年前

Re: 計算式

#6

投稿記事 by Bull » 6年前

コード:

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

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

アバター
usao
記事: 1887
登録日時: 11年前

Re: 計算式

#7

投稿記事 by usao » 6年前

まず「普通のサイコロ(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 かずま » 6年前

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言語何でも質問掲示板” へ戻る