• ベストアンサー

乱数表示のプログラム

 こんにちは。C言語初心者で現在会社で勉強しているものです。上司に課題を出されました。以下の通りです。 「1~100までの数字をランダムに出力するプログラムを作成しなさい。ただし実行するたびにその結果は異なるようにし、同じ数字は表示されないようにしなさい。」  time関数を使って実行する度に異なる結果が得られるところまではできたのですが、一度表示された数字を省くロジックがわかりません。質問検索で似たような質問をされていた方が何人かいて、それを参考にやってみたのですがどうもうまくいきません。できるだけCPUに負荷をかけないように、という条件もあります。  提出期限が迫っており困っています。どなたか教えてください。

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

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.5

2つの課題が有りますね。今までにやってみて一番気に入った方法を。 (1)実行するたびに同じ並びになったら困る。     time関数を使わなくても srand関数を最初に1回書けば実行するたびに乱数が変わるはずです。    (勝手にtime関数を実行してくれる?) (2)重ならない乱数を効率よく100個取り出す。    配列を100個用意し、1から100の数字を入れます。    randでそのうちの1個を選んで出力します。仮に48番目とします。    48番目と100番目を入れ替えます。    次に99個の範囲で1つ選んで出力します。仮に35番目とします。    35番目と99番目を入れ替えます。    次に98個の中から・・・        ということを次々に繰り返していけば最後に配列の対象範囲が0になります。    これをチェックしてループを終了すればいい訳です。    

その他の回答 (4)

  • hilo256
  • ベストアンサー率18% (3/16)
回答No.4

プログラミングはできるだけ自分の力でやった方がいいですよ。 ゆくゆく苦労してしまいますから。 たとえ自分でやったとして効率の悪いのができたとしても はるかにためになりますから。 今回はお困りのようなのでちょっとだけ力になります。 void main(void) { int num[100] = {1,2,3,4,5,6,7,8,9,10,11.....100}; int i,j; for(i=0;i<100;i++){ cnt = rand()%(100-i); printf("%d\n",num[cnt]); for(j=cnt;j<100-1;j++){ num[j] = num[j+1]; } } } これでできませんかね?

  • g_dori
  • ベストアンサー率47% (330/699)
回答No.3

「rand関数を使え」という指示が無ければ、こんな発想もあります。 1~100迄の値が入った数列を用意して、数字をバラバラに入れ替えれば終わりです。(結局ココにrandを使うことになりますので、ある意味課題クリアです) プログラム量も非常に短くなりますし、負荷は入れ替えの回数次第で調節できます。 ところで、time関数ってミリ秒が帰ってくると思うのですが、高速CPUでやるとずっと同じ値が帰ってきたりしませんか・・?

  • ef58
  • ベストアンサー率28% (6/21)
回答No.2

私も同じようなプログラムを作った経験があります。お考えのように1~100までの乱数発生させ、一回登場した数値はフラグでチェックして飛ばすという考え方では100個目を選ぶのにえらく時間がかかり、何か無駄なような気がしました。 そこで例えば1~100までの番号がついたボールがあると考えて。 1.最初の1個を乱数で選ぶ 2.残りは99個なので1~99の乱数発生させ、次の一個を選ぶ 3.また1個減るので、1~98の乱数発生させ、次の一個を選ぶ 4.これを繰返す 5.最後には1個になり、ここで100個目を選んで終り。 いかがでしょうか

hatayamakun
質問者

補足

 早速の解答ありがとうございます。すごく分かりやすいた例えでありがたいです。しかし現在の私の能力では具体的にどうプログラミングしたらよいかどうしても分かりません。選ぶボールを減らしていく方法を教えてください。

  • yotta
  • ベストアンサー率32% (26/79)
回答No.1

データ型は bool , short , char のどれでも構いませんが 配列を 101 取ると 0~100 のフラグとして使用できます その配列を初期化して(これが重要です) 出た結果をフラグに代入し,次に出た結果のフラグに何か代入されているか をチェックすれば同じ数字を表示することは防げます また,表示した個数を数えていれば全ての数字を表示したことがわかります

関連するQ&A

  • C言語でサイコロのプログラムを作ってみたのですが

    まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を 作ってみたのですが、特定の数字が出てこないのです。 例えば、1と4、2と5、3と6 が出ない ここで気がついた事は、 1、出ない目の2数の差は3であること。 2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない 3、約1分間隔で、出ない数字の組み合わせが変わる。 (例えば 1,3,4,6,1,6,3,6,4(2と5が出ない)  →1分間実行し続けると・・・  2,3,6,5,3,2,2,6(1と4が出ない)) この原因は一体なんなのでしょうか・・・ とても気になって仕方がありません。わかる方教えてください。 以下、ソースコードになります #include<stdio.h> #include<time.h> #include<stdlib.h> int func(void); int main(void){ int number=0; number=func(); //サイコロの目の表示 printf("%d\n",number); return 0; } int func(){ //乱数の初期化 srand((int unsigned)time(NULL)); //サイコロの目をランダムで出力し、返す return rand()%6+1; } プログラムの仕組みは パソコンから現在の歴時刻を元に乱数の初期値を変更 ↓ rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する

  • 重複しない組み合わせのプログラム

    0から9のうち4つの数字を取り出すというC言語のプログラムをつくりたいのですが、ランダム関数を用いると重複してしまいます。どのようにしたらよいでしょうか?

  • 完全な乱数を生成する方法

    C言語で乱数を生成するときに、今まで srand(time(NULL)); を使用していたのですが、それだと1秒以内に複数の処理を行った際に、 同一の乱数が生成されてしまいます。 時間にとらわれずに完全にランダムな数字を出現させるにはどのような方法を取るのが簡単なのでしょうか? よろしくお願いします。

  • 乱数を使う

    お世話になっております。 乱数についての質問なんですが、 なんと説明して良いのかわからないので例を挙げます。 コマンドボタンを三つ用意する。 コマンドボタン1をクリックすると、1~3までのランダムな値を表示する。 続けてコマンドボタン2をクリックすると、 先ほど表示した数字以外の1~3までの値を返す。 同様にコマンドボタン3をクリックすると最後に残った数字を表示する。 ってなことがやりたいんですが、 アドバイスお願いします。 あ、あとコマンドボタンを1回クリックすると もう2度とクリックできないようにするなんて事は出来るんですか?

  • C言語プログラム 作ってくれませんか?m(__)m

    C言語 プログラム 1~45の数字の中からランダムに15ペアの組み合わせと残りの数字を表示するようなプログラムをつくりたいのですが,どなたか作ってくれませんか? 以下のような表示例みたいなのが,嬉しいです。お願いします。 Ex. ./ random 6 -27 5 -22 4 -19 1 -21 15 -14 33 -40 17 -36 37 -28 13 -42 23 -41 34 -24 7 -35 38 -11 12 -8 26 -18 43 9 3 25 16 2 44 29 30 39 45 10 20 32 31

  • 乱数について

    今、あるデータの順番をばらばらにするプログラムを作ろうとしています。  たとえば、a,b,c,dとあったら、d,b,c,aとするように、この時考えられるプログラムは、データの数だけ配列を用意して、乱数で、どのデータを出力させるかを決定し、出力し終わったら、その配列のところに印を立てて、次にくるデータに対して、2重にならないように順次、出力していく方法が考えられるのですが。。。    膨大なデータをこのように、すると、二重になる確立が出力するたびに、高くなっていって、なかなか終わらなくなってしまいます。  そこで、残ったデータから、ランダムに選び出すアルゴリズムまたは、関数はないでしょうか?よろしくお願いします。

  • パスカル言語を用いた乱数利用について

    パスカル言語を用いた乱数発生についての質問です。 パスカル言語を用いて0~100までの整数をランダムで10個出したいので、次のようにプログラムを組んだのですが、 欲しい乱数が出てきません。どこが間違えているか指摘していただけないでしょうか。よろしくお願いします。 var x : integer; p : real; {本当はintegerなのだろうが、使うよう指示されたrandom関数を使うとなるとrealしか受け付けなかった。} begin i := 0; x := seed(wallclock); while i <> 10 do begin i := i + 1; p := random(100); writeln('random(100)=',p) end end. ちなみに、これを出力した時の例はこのような感じです。 random(100)=6.8e-01 random(100)=6.4e-02 random(100)=9.3e-01 random(100)=1.3e-01 random(100)=7.2e-01 random(100)=8.8e-01 random(100)=9.1e-02 random(100)=9.5e-01 random(100)=3.6e-01 random(100)=7.9e-01 (※6.8e-01とは6.8*10^(-1)をのことです)

  • エクセルで乱数を作成する

    たとえば、 A1~A1000に0から始まる9桁の数字を入力したとき、 B1に、B1~B1000内で重複しない、4桁の英数文字を表示させたいのです。 マクロは使わず関数で4桁の英数文字をランダムで表示させることは可能でしょうか? よろしくお願いいたします。

  • 3つほどプログラムをおしえてください。

    (1)100までの整数をいくつか入力し、10刻みでの個数を表示し、負の数が入力されると整数の入力を終わるプログラムです。各範囲の個数は配列に格納する。 実行結果 65 30 21 95 5 -1 0--- 9 : 1 10--- 19 : 0 20--- 29 : 1 30--- 39 : 1 40--- 49 : 0 50--- 59 : 0 60--- 69 : 1 70--- 79 : 0 80--- 89 : 0 90---100 : 1 (2)数字の文字列を入力し、その文字列に含まれる各数字(文字)'0','1',~'9'の個数を表示するプログラムの作成。 実行結果 1231234567 0: 0 1: 2 2: 2 3: 2 4: 1 5: 1 6: 1 7: 1 8: 0 9: 0 (3) 変数xは、0~1までの0.01刻みの値(101個)を取るとする。このとき、2次関数 f(x)=3x^2+2x+1の値が2.0<f(x)<3.0となるxの値をの個数を求めるプログラムの作成。ただし、xを引数としf(x)の値を返す関数を作成して、それを使用する。 実行結果 number=21 やってるうちにわけがわからなくなってしまいます。どなたかよろしくおねがいします。

  • C言語プログラム

    学校のレポートでC言語のプログラムを作りました。ところが実行してみると計算値を表示させるところに -1.#IND00 と表示されます。本当は実数が表示されるはずなに・・・ 多分、私のプログラムが間違っているのだろうと思います。どこが間違っているのか目星をつけるためにこの出力結果の意味を教えてほしいのです。