- ベストアンサー
ランダムで数を表示するには
C言語を覚えたてなんですが 計算や変数を代入などは本にやり方が書いてあってわかったのですが たとえばサイコロやルーレットのプログラムを作るとして 1~6の数字がランダムででるようなプログラムをつくるには どうすればいいのでしょうか? また1が50%で、2が25%、3が10%で4~6が5%づつとか 出る確率を設定することとかも出来るのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
乱数は1の方が答えてるので、確率は kakuritsu = 80; if(kakuritsu <=0 || kakuritsu < rand()%100+1) { 外れ }else{ 当たり } で出来るはずです。kakuritsuには%の数が入ります。 この場合は80%の確率で当たります。 関数にすると良いかもしれません。 1が50%で、2が25%というやり方だと、その1とか2という変数に応じて確率を入れると良いと思います。
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >また1が50%で、2が25%、3が10%で4~6が5%づつとか >出る確率を設定することとかも出来るのでしょうか? この場合は 0~99(%) までの乱数を発生させてif出条件分岐すればよい。 下にサンプルを載せておきます。 サンプル1: int rnd, saikoro; // 乱数の初期化と乱数発生 srand( time(NULL) ); rnd = (rand() % 100); if ( rnd < 50 ){ saikoro = 1; } else if ( rnd < 50+25 ){ saikoro = 2; } else if ( rnd < 50+25+10 ){ saikoro = 3; } else if ( rnd < 50+25+10+5 ){ saikoro = 4; } else if ( rnd < 50+25+10+5+5 ){ saikoro = 5; } else if ( rnd < 50+25+10+5+5+5 ){ saikoro = 6; } サンプル2: static const int randtable[] = { 50, 25, 10, 5, 5, 5, -1, }; int i, sum, rnd, saikoro; // 乱数の初期化と乱数発生 srand( time(NULL) ); rnd = (rand() % 100); for ( sum = i = 0 ; randtable[i] != -1 ; i++ ){ sum += randtable[ i ]; if ( rnd < sum ){ saikoro = (i + 1); break; } } その他: ・サンプル1、サンプル2も両方とも同じです。 サンプル2は後で確立のパーセントをカスタマイズ可能にするために randtable 配列と for分を使っています。サンプル1は理解しやすいようにしました。 参考にして下さい。 ・以上。
お礼
回答ありがとうございます if elseは多少ですがつかったことあるんでわかります わざわざサンプルありがとうございました^^ 大変わかりやすいです^^
一応no2の解説。 紙に棒を書きます。1から100までのメモリがあります。 確率の長さだけ下から塗りつぶします。 80%なら、1から80まで。 その棒を矢印が高速で動いています( rand()%100+1 )。止まったとき、塗りつぶしたところである、1から80のどこかに矢印が止まれば当たりです。 外れである、81から100の間に止まれば外れです。 0%やマイナス4000%なんていうのは勿論外れです。 友人に考えてもらったんですけどね。 ちなみに確率が少数になる場合は、小数点を動かして整数にして、randの部分も出る数をそれに合わせてください。 例えば、80.5%で当たるなら整数の805にして、棒の長さは100ではなく1000になります。両方十倍。 1000のうち1から805のどこかに矢印が止まればあたりです。
お礼
回答ありがとうございます 大変わかりやすい説明で自分でも理解できます^^; rand関数は自分がもってる本には載ってないみたいです 入門編と応用編2冊ありますがもっと高度なのかも^^; ありがとうございました
お礼
回答ありがとうございます ifは本に書いてあったのでわかります(少しですが^^;) randという関数は初めてみました。 自分が買った本は超初心者用だと思うんで^^;