• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:20枚から7枚選んだ時の確率)

20枚から7枚選んだ時の確率とは?

このQ&Aのポイント
  • 20枚のカードから7枚を無作為に選び、結果を表示します。
  • その後、選んだ7枚の中に特定のカードが含まれていた場合、そのカードの数を加算し、確率を求めて表示します。
  • プログラムの実装方法について詳しくは質問文をご覧ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

#1の補足を見て。 どうやら、日本語を変数に使えるコンパイラだと理解しました。 > - ほかのなにか? 確率の部分が表示されなくて困ってます。 この「表示されない」とは、文字通りの「表示されない」なのでしょうか? だとしたら、添付されたプログラムに、確率計算している部分も、それを表示している部分もありません。「表示されない」のが正しい動作です。 確率を計算して、それを出力するように、プログラムに追加してください。 もし、計算部分、表示部分が作ってあって、その結果と、予想してる結果とが違うのなら、プログラムに間違いがあります。 どのように計算をやって、どんな結果が出ているのでしょうか? 予想として (熟慮 + 熟慮1 + 熟慮2) / 7 など と計算していて、「結果がいつも0になる」のではないでしょうか? あるいは printf("確率 %f\n", (熟慮 + 熟慮1 + 熟慮2) / 7 ) ; 等とやって、「値が変」なのではないでしょうか? Cの演算の原則として「整数型+整数型=整数型」「整数型 / 整数型 = 整数型(小数点以下切り捨て)」となります。 ・ (熟慮 + 熟慮1 + 熟慮2) は int + int + intなので、intとなります。 ・単に「7」と書いた場合、これは int 型の7 になります。 全体でint / int なので、答えは int になります。 確率の性質を考えれば、ほとんどの場合で 0 になります。100%のときだけ 1 です。 小数点以下の値を扱うには、浮動小数点型(double,float)を使用します。 intをこれらの型に変換するには、型変換(キャスト)を用います。 今回の場合、合計は整数のままで問題ないので、割り算をdoubleで行うように (double)(熟慮 + 熟慮1 + 熟慮2) / 7 とします。 double / int は、自動でdouble / double として計算されます。 printf("確率 %f\n", (熟慮 + 熟慮1 + 熟慮2) / 7 ) ; こちらの場合、計算結果がintなのは同じですが、別の問題があります。 printfに指定する引数は、 %の書式と一致させる必要があります。しかし、一致していない場合でも、コンパイルエラーにはなりません。(警告が出る場合はありますが、エラーにはなりません) C言語の仕様の問題で、printfでは、引数の型を判断することができないのです。そのため、%の書式から、その指定した型だと断定して値を取り出そうとします。 %fはdouble型を要求します。それに対して、引数はintです。 このとき、int→doubleの変換は行われません。 intの数値のメモリ上での表現を、そのままdoubleのメモリ上の表現だと解釈してしまいます。 また、一般に、doubleはintよりもサイズが大きいです。intで足りない部分は、メモリの後の領域(そこに、何があるかはわかりません)まで勝手に使ってしまいます。 このため、引数で指定した値とはまったく違う値が出力されることがあります。 確率計算そのものについては、「何に対する何の確率」なのかが不明なので、例示できません。

74591111
質問者

補足

double ave( double 熟慮, double 熟慮1, double 熟慮2); double ave(double 熟慮 ,double 熟慮1, double 熟慮2) { double wk; wk=(熟慮+熟慮1+熟慮2)/60; return wk; } 書いてみたり printf("計算:%d%f\n",(熟慮+熟慮1+熟慮2)/60); してました 納得のいく回答を書いていらしていたのでベストアンサーにしておきます

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

一般的なCコンパイラでは、変数名に日本語は使えません。 表示されないどころか、コンパイルもできません。 日本語が使える特殊なコンパイラだとすると、問題無さそうに見えるので、「実行できたけど、その結果を確認できない」ということが考えられます 例: Visual Studioで実行すると。一瞬DOS窓が開いて結果が出力されるが、実行終了と同時にDOS窓が閉じるので、内容を確認できない

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

> 計算式などを書いたのですが表示されなくて困っております。 「表示されない」とは? - コンパイルエラー? - 何ひとつ出力されない? - 結果がデタラメ? - ほかのなにか? > どなたか途中まででいいので書いてくださると助かります。 あなた途中まで書いてるやないですか。

74591111
質問者

補足

コンパイルエラー? × - 何ひとつ出力されない? × ランダムに表示されます - 結果がデタラメ? × - ほかのなにか? 確率の部分が表示されなくて困ってます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語トランプの確率を計算について

    やりたいこと30枚のカードから7枚を無作為に選んで表示、熟慮、熟慮1,熟慮2が表示されたときその合計を足して30割った確率を同時に表示したいのですが結果が表示されず困っております。コンパイルエラーとかは表示されず画面にも何も表示されません。どなたかソースを書いてくださると助かります。 なぜこのようなものを組もうと思ったかは聞かないでください #include <stdio.h> #include <stdlib.h> #include <time.h> double ave(double 熟慮,double 熟慮1, double 熟慮2); int main(void){ int i,j; int 瞬唱の魔道士 = 0,瞬唱の魔道士1 = 0,瞬唱の魔道士2 = 0, ボーラスの占い師 = 0, ボーラスの占い師1 = 0,ボーラスの占い師2 = 0,修復の天使 = 0,修復の天使1 = 0, 修復の天使2 = 0, 霊異種 = 0, 中略 = 0, 中略1 = 0,灼熱の槍 = 0,灼熱の槍1 = 0, 熟慮 =0,熟慮1 =0,熟慮2 =0,アゾリウスの魔除け= 0,アゾリウスの魔除け1= 0, アゾリウスの魔除け2= 0,スフィンクスの啓示=0,スフィンクスの啓示1=0,スフィンクスの啓示2=0, 変化+点火=0,変化+点火1=0,先導者のらせん=0,先導者のらせん1=0,先導者のらせん2=0, srand((unsigned int)time(NULL)); for(j = 0; j <= 6; j++){ i = rand() % 30+1;// if(i == 1) 瞬唱の魔道士++; if(i == 2) 瞬唱の魔道士1++; if(i == 3) 瞬唱の魔道士2++; if(i == 4) ボーラスの占い師++; if(i == 5) ボーラスの占い師1++; if(i == 6) ボーラスの占い師2++; if(i == 7) 修復の天使 ++; if(i == 8) 修復の天使1 ++; if(i == 9) 修復の天使2 ++; if(i == 10) 霊異種 ++; if(i == 11) 中略 ++; if(i == 12) 中略1 ++; if(i == 13) 灼熱の槍 ++; if(i == 14) 灼熱の槍1 ++; if(i == 15) 熟慮 ++; if(i == 16) 熟慮1 ++; if(i == 17) 熟慮2 ++; if(i == 18) アゾリウスの魔除け ++; if(i == 19) アゾリウスの魔除け1 ++; if(i == 20) アゾリウスの魔除け2 ++; if(i == 21) スフィンクスの啓示 ++; if(i == 22) スフィンクスの啓示1 ++; if(i == 23) スフィンクスの啓示2 ++; if(i == 24) 変化+点火 ++; if(i == 25) 変化+点火1 ++; if(i == 26) 巻きなおし ++; if(i == 27) 巻きなおし1 ++; if(i == 28) 先導者のらせん ++; if(i == 29) 先導者のらせん1 ++; if(i == 30) 先導者のらせん2 ++; printf("瞬唱の魔道士:%d\n", 瞬唱の魔道士); printf("瞬唱の魔道士:%d\n", 瞬唱の魔道士1); printf("瞬唱の魔道士:%d\n", 瞬唱の魔道士2); printf("ボーラスの占い師:%d\n", ボーラスの占い師); printf("ボーラスの占い師:%d\n", ボーラスの占い師1); printf("ボーラスの占い師:%d\n", ボーラスの占い師2); printf("修復の天使:%d\n", 修復の天使); printf("修復の天使:%d\n", 修復の天使1); printf("修復の天使:%d\n", 修復の天使2); printf("霊異種:%d\n", 霊異種); printf("中略:%d\n", 中略); printf("中略:%d\n", 中略1); printf("灼熱の槍:%d\n", 灼熱の槍); printf("灼熱の槍:%d\n", 灼熱の槍1); printf("熟慮:%d\n", 熟慮); printf("熟慮:%d\n", 熟慮1); printf("熟慮:%d\n", 熟慮2); printf("アゾリウスの魔除け:%d\n", アゾリウスの魔除け); printf("アゾリウスの魔除け:%d\n", アゾリウスの魔除け1); printf("アゾリウスの魔除け:%d\n", アゾリウスの魔除け2); printf("スフィンクスの啓示:%d\n", スフィンクスの啓示); printf("スフィンクスの啓示:%d\n", スフィンクスの啓示1); printf("スフィンクスの啓示:%d\n", スフィンクスの啓示2); printf("変化+点火:%d\n",変化+点火 ); printf("変化+点火:%d\n",変化+点火1 ); printf("巻きなおし:%d\n",巻きなおし ); printf("巻きなおし:%d\n",巻きなおし1 ); printf("先導者のらせん:%d\n",先導者のらせん ); printf("先導者のらせん:%d\n",先導者のらせん1 ); printf("先導者のらせん:%d\n",先導者のらせん2 ); return 0; } double ave(double 熟慮, double 熟慮1 ,double 熟慮2) { double wk; wk=(double)(熟慮 + 熟慮1 + 熟慮2) /30 return wk; }

  • for文内でscanf関数により配列に数値を格納することについて

    プログラミング初心者です。 よろしくお願いします。 ◎1------------------------------------ #include<stdio.h> int main(void) { int i,dt[3]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[3]=%d\n",dt[3]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("dt[3]=%d\n",dt[3]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- ◎2------------------------------------ #include<stdio.h> int main(void) { int i,dt[2]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- 以上2つのプログラムについて疑問があります。 まず◎1については、あえて添え字のdt[3]の値を見てみようと思ったら、iの値が入っているとわかりました。 しかし、何故添え字の番号の配列にiの値が入っているのかがわかりません。 次に◎2ですが、3回目のループで、添え字の番号の配列自身に入力した数値を格納すると、iと添え字番号配列に入力した数値が入っていました。 何故このようになっているのか疑問です。 以上のような疑問があります。 添え字の番号の配列とiが何か関連があるようですがいまいちわかりません。 教えていただけると嬉しいです。

  • じゃんけんゲームをつくったのですが・・・。

    自分でじゃんけんゲームを作ってみたのですが、他の人のソースで どういう風に組んでいるのか研究したいのでソースお願いします。 後、もっとこういう風にした方がいいとおもう所があればおねがいします。 <ソース> #include<stdio.h> #include<time.h> #include<stdlib.h> int main() { int i; int n; srand(time(NULL)); n=rand()%3; printf("じゃんけんをします,0がグーで1がチョキで2がパーです\n"); printf("じゃんけんぽい!"); scanf("%d",&i); if(i==0&&n==0){ printf("あいこです\n"); } else if(i==0&&n==1){ printf("勝ちました\n"); } else if(i==0&&n==2) { printf("負けました\n"); } if(i==1&&n==0){ printf("負けました\n"); } else if(i==1&&n==1){ printf("あいこです\n"); } else if(i==1&&n==2) { printf("勝ちました\n"); } if(i==2&&n==0){ printf("勝ちました\n"); } else if(i==2&&n==1){ printf("負けました\n"); } else if(i==2&&n==2){ printf("あいこです\n"); } if(i>2) { printf("やりなおしてください\n"); } return 0; }

  • 素数判定の繰返し

    繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。 まず繰返しなしの素数判定プログラムを作り #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } return(0); } これはちゃんとできたのですがそれを繰り返すことができません。 #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); while((a=getchar())!=EOF){ if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } printf("自然数を入力:"); scanf("%d",&a); } printf("プログラムを終了します。\n"); return(0); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • c++ visual 2008 星座おみくじ

    #include "stdafx.h" #include "stdlib.h" int _tmain(int argc, _TCHAR* argv[]) { Int y,m,d; while(swgo!=0) { printf("生年月日を入力してください\n"); printf("年=") ; scanf_s("%d",&y) ; printf("月=") ; scanf_s("%d",&m) ; printf("日=") ; scanf_s("%d",&d) ; printf("[%d年%d月%d日]\n",y,m,d) ; printf("\n"); if(m*100+d=>0321 && m*100+d=<0419 ) printf("牡羊座\n"); if(m*100+d =>0420 && m*100+d=<0520 ) printf("牡牛座\n"); if(m*100+d =>0521 && m*100+d=<0621 ) printf("双子座\n"); if(m*100+d =>0622 && m*100+d=<0722 ) printf("蟹座\n"); if(m*100+d =>0723 && m*100+d=<0822 ) printf("獅子座\n"); if(m*100+d =>0823 && m*100+d=<0922 ) printf("乙女座\n"); if(m*100+d =>0923 && m*100+d=<1023 ) printf("天秤座\n"); if(m*100+d =>1024 && m*100+d=<1121 ) printf("蠍座\n"); if(m*100+d =>1122 && m*100+d=<1221 ) printf("射手座\n"); if(m*100+d =>1222 && m*100+d=<0119 ) printf("山羊座\n"); if(m*100+d =>0120 && m*100+d=<0218 ) printf("水瓶座\n"); if(m*100+d =>0219 && m*100+d=<0320 ) printf("魚座\n"); } while(jsw==1) printf("\n==終了ならを、継続なら1を入力してください=");sacnf_s("%d",&swgo); long s; unsigned int randmx; int rj; randmx=32767; s=12357; srand(s); for(i=1;i<=imax;i++){ rj=rand()*6.0/((float) randmx)+1; printf("%5d",rj); if(i&10==0) printf("\n"); rj=1 大吉 rj=2 中吉 rj=3 小吉 rj=4 末吉 rj=5 小凶 rj=6 末吉 rj=7 小凶 rj=8  中凶 rj=9 大凶 return 0; } 一応 考えて見て打ってみたのですが、エラーが出でしまい出来ません。 自分でもこれでは駄目だとわかります。特に乱数の使い方がわかりません。  何をしたいかと言うと 星座おみくじを作りたいのです。  生年月日を入れてくださいという画面が出て 生年月日を入れたら 星座が出て、 1-9の好きな数を入れてくださいと画面が表示され 数字を入れたら ランダムで おみくじの結果を出すプログラムを作りたいです。   どなたか アドバイスください。 よろしくお願いします。

  • 10個出力で改行したいのですが・・・

    #include <stdio.h> main() { int i, n; for( i = 1, n = 0; n < i; i++ )    { if(i%3 == 2 && i%4 == 1 && i<1000 ) {  printf("%4d,",i);   if(i%10==0)        printf("\n");    n++;       }    } printf("\n"); } このプログラムは、3で割ると2余り、4で割ると1余る自然数で1000より小さいものを小さい順に表示するもので、 一行に10個ずつ表示して改行したいのですが、どうすればいいでしょうか? if文が間違っていると思うのですが・・・

  • c++

    /* char03*/ #include<stdio.h> int main() { char i; for(i='!';i<='~';i++){ printf(%3d(0x%2X)--%c",i,i,i); if((1-'!'+1)%4==0 printf("\n") } printf("\n") return("\n") return 0; } if((1-'!'+1)%4==0はどういう意味でしょうか

  • C言語のIF関数のアドバイスお願いします。

    #include <stdio.h> int main(){ int x,i,div=0; printf("x="); scanf("%d",&x); for(i=1;i<=x;i++){ if(x%i == 0){ div++; } } if(ここがわかりません) printf("%dは素数です\n",x); else printf("%dは素数でありません\n",x); return 0; }

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓