プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (5件)

データ型は bool , short , char のどれでも構いませんが


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

私も同じようなプログラムを作った経験があります。

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

この回答への補足

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

補足日時:2002/03/26 13:52
    • good
    • 0

「rand関数を使え」という指示が無ければ、こんな発想もあります。



1~100迄の値が入った数列を用意して、数字をバラバラに入れ替えれば終わりです。(結局ココにrandを使うことになりますので、ある意味課題クリアです)
プログラム量も非常に短くなりますし、負荷は入れ替えの回数次第で調節できます。

ところで、time関数ってミリ秒が帰ってくると思うのですが、高速CPUでやるとずっと同じ値が帰ってきたりしませんか・・?
    • good
    • 0

プログラミングはできるだけ自分の力でやった方がいいですよ。


ゆくゆく苦労してしまいますから。
たとえ自分でやったとして効率の悪いのができたとしても
はるかにためになりますから。
今回はお困りのようなのでちょっとだけ力になります。

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];
}
}
}

これでできませんかね?
    • good
    • 0

2つの課題が有りますね。

今までにやってみて一番気に入った方法を。
(1)実行するたびに同じ並びになったら困る。
    time関数を使わなくても srand関数を最初に1回書けば実行するたびに乱数が変わるはずです。
   (勝手にtime関数を実行してくれる?)

(2)重ならない乱数を効率よく100個取り出す。
   配列を100個用意し、1から100の数字を入れます。
   randでそのうちの1個を選んで出力します。仮に48番目とします。
   48番目と100番目を入れ替えます。
   次に99個の範囲で1つ選んで出力します。仮に35番目とします。
   35番目と99番目を入れ替えます。
   次に98個の中から・・・
   
   ということを次々に繰り返していけば最後に配列の対象範囲が0になります。
   これをチェックしてループを終了すればいい訳です。
   
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!