こんにちは。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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
【C言語】配列の中に配列を入れ...
-
C# 配列の変数宣言について。
-
#N/Aを含む列の最小値の求め方
-
C言語 配列の再初期化
-
テキストファイルから文字列を...
-
C# Listを使わずに2次元配列の...
-
先頭アドレスとは何ですか?
-
ゼロサプレスって?
-
配列をEraseしてもメモリが開放...
-
C++ vectorに配列をプッシュしたい
-
VB.netでRadioButtonを配列にし...
-
c#について、現在テトリスを作...
-
VBで構造体の配列を関数に渡す...
-
シーケンスの解析に使うclustal...
-
VB.NET 構造体の配列の検索機能...
-
Dimとは・・・
-
Excel、VBAのユーザーフォーム...
-
【速いブラインドタッチ】手を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
C# 配列の変数宣言について。
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
テキストファイルから文字列を...
-
C言語で特定列だけを抽出して配...
-
Excel、VBAのユーザーフォーム...
-
【C言語】配列の中に配列を入れ...
-
配列を含む構造体の初期値について
-
unsigned char配列への入力の仕方
-
複数の選択範囲の行番号を個別...
-
【速いブラインドタッチ】手を...
-
配列の参照渡しで型が一致しま...
-
ExcelVBAで質問です。離れた二...
-
VB.NET 構造体の配列の検索機能...
-
VBでC言語のポインタみたい...
-
Redimした動的配列はEraseする...
おすすめ情報