• ベストアンサー

ランダムで数を表示するには

C言語を覚えたてなんですが 計算や変数を代入などは本にやり方が書いてあってわかったのですが たとえばサイコロやルーレットのプログラムを作るとして 1~6の数字がランダムででるようなプログラムをつくるには どうすればいいのでしょうか? また1が50%で、2が25%、3が10%で4~6が5%づつとか 出る確率を設定することとかも出来るのでしょうか?

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

  • ベストアンサー
noname#51262
noname#51262
回答No.2

乱数は1の方が答えてるので、確率は kakuritsu = 80; if(kakuritsu <=0 || kakuritsu < rand()%100+1) { 外れ }else{ 当たり } で出来るはずです。kakuritsuには%の数が入ります。 この場合は80%の確率で当たります。 関数にすると良いかもしれません。 1が50%で、2が25%というやり方だと、その1とか2という変数に応じて確率を入れると良いと思います。

abc-1356
質問者

お礼

回答ありがとうございます ifは本に書いてあったのでわかります(少しですが^^;) randという関数は初めてみました。 自分が買った本は超初心者用だと思うんで^^;

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★アドバイス >また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は理解しやすいようにしました。  参考にして下さい。 ・以上。

参考URL:
http://www.mit.msn.to/algorithm/stdlib.html
abc-1356
質問者

お礼

回答ありがとうございます   if elseは多少ですがつかったことあるんでわかります わざわざサンプルありがとうございました^^ 大変わかりやすいです^^

noname#51262
noname#51262
回答No.3

一応no2の解説。 紙に棒を書きます。1から100までのメモリがあります。 確率の長さだけ下から塗りつぶします。 80%なら、1から80まで。 その棒を矢印が高速で動いています( rand()%100+1 )。止まったとき、塗りつぶしたところである、1から80のどこかに矢印が止まれば当たりです。 外れである、81から100の間に止まれば外れです。 0%やマイナス4000%なんていうのは勿論外れです。 友人に考えてもらったんですけどね。 ちなみに確率が少数になる場合は、小数点を動かして整数にして、randの部分も出る数をそれに合わせてください。 例えば、80.5%で当たるなら整数の805にして、棒の長さは100ではなく1000になります。両方十倍。 1000のうち1から805のどこかに矢印が止まればあたりです。

abc-1356
質問者

お礼

回答ありがとうございます 大変わかりやすい説明で自分でも理解できます^^; rand関数は自分がもってる本には載ってないみたいです 入門編と応用編2冊ありますがもっと高度なのかも^^; ありがとうございました

noname#98978
noname#98978
回答No.1
abc-1356
質問者

お礼

回答ありがとうございます 乱数というのですね

関連するQ&A

  • C++のcin命令について

     私は、C++言語を勉強している初心者です。  ある日、C++言語では、   「cin >> a >> b >> c;」と書くと、プログラムを実行したときに、   「3 4 5」と入力すれば、変数aには 3 が、変数bには 4 が、変数cには 5 が代入されるということを知りました。  けど、今まで私がC言語を使う際に使っていた、   「scanf("%d,%d,%d",&a,&b,&c);」という文では、プログラムを実行したときに、   「3,4,5」と入力すれば、変数aには 3 が、変数bには 4 が、変数cには 5 が代入されるというように、3つの数字の間にカンマを入れて数を代入するというプログラムを作りたいのですが、どうやってもcin命令では再現できません。  超初心な質問ですが、わかる方がいらっしゃったら、やり方を教えてください。

  • プログラミングの読み方、書き方のコツ

    私はC言語を習って1年たつのですが 他人のプログラムを読んだり、自分でプログラムを書いたりするのが難しいです。 そこで私の場合、プログラムを読むときには メイン関数から読んだり、変数に数字を代入してみたりしています。 また、プログラムを書くときには わかりやすい変数を用いたり、インデントをつけたりしています。 みなさんはどんなコツを使って読んだり書いたりしていますか? いろいろ教えていただけるとありがたいです。 よろしくお願いします。

  • ランダムというのは、本当にランダムなの?

    サイコロを振って出る目は1/6と言っても、 それぞれの面の凹んだ部分、黒と赤の塗料の量、使い込んだ擦り減り、 落とした後の回る時間などで、 本当のランダムな結果ではないという考えがあります。 コンピューターが1~6までの数字をランダムに出す場合、 それは本当にランダムなのでしょうか? 結果を出すまでの過程でクセは無いのでしょうか? 例えば、プログラムAでは、1万回やって、ようやく出た目がそれぞれほぼ同じ回数になったり、プログラムBでは、1万回やっても、多く出た目と少ない目の回数が意外に開きあるとか。 そういうことはあるのでしょうか? 回路の中の微小な抵抗の違いにより、文字認識のし易さとか(例えです)、 どこかで、公正ではなく影響してるなどありうるでしょうか?

  • 整数型の配列をランダムに並べ替える方法

    100ます計算の問題を作る、というプログラムを作ってみようと考えています。 問題となる数列は、1から9までの数字をランダムに並べ替えた物になるはずです。 さて、この「ランダムに並べ替えた数字」というのは、どういったアルゴリズムで作成するのが最適なのでしょうか? 個人的に思いついたのは、以下のような方法です。 1.整数型の配列変数(要素が9個)を作成し、それぞれ1から9まで数字を入れておきます。 2.乱数を使って、「x番目とy番目の数字を入れ替え」という風に、何度も入れ替えを行います。 これだと非常に単純なのですが、正直言って素人の考えなので、最適なのかどうか疑問なのです。 もっと最適な方法があれば教えて頂きたいです。

  • ランダムはどう起こりうる??

    MP3プレーヤーを聞いていてふと思ったんですが、 シャッフルってどうなってるんでしょうか?? トラックが1~13まであるとして、8を再生して、その次は3、となるときの「意思決定の根本の理由」は何なのでしょう? Lingoと言うプログラムをしたことがあるのですが、そのランダム設定をするときは、ルールをつかい1~13までの数字を打ち込むだけだったんです。 ランダムを作る数式があるとYahooの質問で探したのですがあまり理解できませんでした。割る方式で余りの数字がどうだとか。。 直感的に質問したのでわかりにくいかもしれませんが、わかりやすく教えていただけるかた、ご教授お願いします!

  • ランダムの比較について

    今ランダムで数字を選ぶプログラムを作っています。 4つの変数に全て異なる数字を入れたいのですが どうやって比較をすれば良いのか分かりません。 while(true){ $rd1 = rand(0,30); $rd2 = rand(0,30); if($rd1 != $rd2){ break; } } 一応二つの比較ならこれで良いのかと思うのですが 3つ以上になった場合にどういう風にすれば良いのか教えてください。 どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • 円周率ってランダムなんですか?

    人間が作るRAND関数などは知っていますが、何か癖や傾向があるのは知っています。サイコロを振るにせよ、人間の癖そのた環境のかかわりが0ではないので完全なランダムではありません。 しかし 円周率は完全なランダムなのではないですか? 3.14あたりまでは、あれとしても 3.14159・・・と、小数点以下で最大の9をとっていますよね。 ということは、9の出現以降は、もうランダムとみなしてもいいのではないでしょうか? 人間が覚えてしまっただけであって、今何億桁まで計算されてるらしいですが、 まだ未判明の次の桁は、0~9まで完全なランダム(10%ジャストの確率で出現) といえるのではないでしょうか? その途中で、たとえば1111111111111111・・・・とか1が300個ぐらい連続で続いたとしても それはランダムとしてありえるわけですし あと無理数って全部ランダムとみなしていいんでしょうか それとも、そもそも真性のランダム数などというものが存在のでしょうか。

  • perlで確率計算

    学校で「1つのサイコロを振ったとき, 3以下の数字が出た場合,もう一度サイコロを振っても良いものとする. このとき合計が6になる確率を,プログラムを利用して計算せよ」 というperlの課題が出されたのですが、さっぱりわかりません。 どなたか詳しく教えていただけませんでしょうか?

    • ベストアンサー
    • Perl
  • 確率計算が得意な方

    ヨーロピアンルーレット(0が1つのルーレット)で、「1~12の数字が連続して15回来る確率」が知りたいです。  あと、逆に「1~12の数字が15回連続出ない確率」も知りたいです。  計算できる方よろしくお願いします。

  • 出る目がランダムの場合、ランダムに賭けた場合とそうでない場合とでは、当たる確率はどちらが上か?

    ある本でこうありました(簡単にするために省力していますが) 1から10の数字が書かれた箱の中に当たりが入っているという、簡単なゲームがあります。 当たりを引けばWINです。 どの番号の箱を当たりにするかはランダムで決めます(無作為)。 何回でもいいのですが、わかりやすくするためにこのゲームを10回続けるとします。 ここから本題なんですが、この箱の当たりを引こうとする場合、ランダムで1から10の数字の箱を選ぶ場合と、どれかの数字の箱を選び続ける場合とではどちらが当たる確率が高いのでしょうか?

専門家に質問してみよう