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

No.3
- 回答日時:
「rand関数を使え」という指示が無ければ、こんな発想もあります。
1~100迄の値が入った数列を用意して、数字をバラバラに入れ替えれば終わりです。(結局ココにrandを使うことになりますので、ある意味課題クリアです)
プログラム量も非常に短くなりますし、負荷は入れ替えの回数次第で調節できます。
ところで、time関数ってミリ秒が帰ってくると思うのですが、高速CPUでやるとずっと同じ値が帰ってきたりしませんか・・?
No.2
- 回答日時:
私も同じようなプログラムを作った経験があります。
お考えのように1~100までの乱数発生させ、一回登場した数値はフラグでチェックして飛ばすという考え方では100個目を選ぶのにえらく時間がかかり、何か無駄なような気がしました。そこで例えば1~100までの番号がついたボールがあると考えて。
1.最初の1個を乱数で選ぶ
2.残りは99個なので1~99の乱数発生させ、次の一個を選ぶ
3.また1個減るので、1~98の乱数発生させ、次の一個を選ぶ
4.これを繰返す
5.最後には1個になり、ここで100個目を選んで終り。
いかがでしょうか
この回答への補足
早速の解答ありがとうございます。すごく分かりやすいた例えでありがたいです。しかし現在の私の能力では具体的にどうプログラミングしたらよいかどうしても分かりません。選ぶボールを減らしていく方法を教えてください。
補足日時:2002/03/26 13:52No.1
- 回答日時:
データ型は bool , short , char のどれでも構いませんが
配列を 101 取ると 0~100 のフラグとして使用できます
その配列を初期化して(これが重要です)
出た結果をフラグに代入し,次に出た結果のフラグに何か代入されているか
をチェックすれば同じ数字を表示することは防げます
また,表示した個数を数えていれば全ての数字を表示したことがわかります
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
c言語でのヒストグラム作成用の...
-
C言語 メモリ?
-
銀行ATMの数字キーの配列
-
配列を含む構造体の初期値について
-
Functionの戻り値を2次元配列...
-
C++ 配列を返すには?
-
ポインタの配列のコンマについて
-
ゼロサプレスって?
-
VBで構造体の配列を関数に渡す...
-
C# Listを使わずに2次元配列の...
-
4勤2休のシフト作成
-
int型をchar型に(右詰で)代入...
-
プラスの最小数字を表示したい...
-
unsigned char の配列で途中で0...
-
先頭アドレスとは何ですか?
-
CStringからchar*への型変換に...
-
VBAのプログラムで、DIAG = 1# ...
-
init関数の意味
-
c言語のポインタへの文字列入力...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
C# Listを使わずに2次元配列の...
-
配列を含む構造体の初期値について
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
【速いブラインドタッチ】手を...
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
配列をEraseしてもメモリが開放...
-
メモリの初期値
-
複数の選択範囲の行番号を個別...
-
unsigned char配列への入力の仕方
-
【C言語】配列の中に配列を入れ...
-
VBで構造体の配列を関数に渡す...
-
エラ-メッセ-ジの意味を教え...
-
C# 配列の変数宣言について。
-
C言語 配列の再初期化
-
LGノートPCグラムについて
-
C言語初心者 構造体 課題について
おすすめ情報