こんにちは。C言語初心者で現在会社で勉強しているものです。上司に課題を出されました。以下の通りです。
「1~100までの数字をランダムに出力するプログラムを作成しなさい。ただし実行するたびにその結果は異なるようにし、同じ数字は表示されないようにしなさい。」
time関数を使って実行する度に異なる結果が得られるところまではできたのですが、一度表示された数字を省くロジックがわかりません。質問検索で似たような質問をされていた方が何人かいて、それを参考にやってみたのですがどうもうまくいきません。できるだけCPUに負荷をかけないように、という条件もあります。
提出期限が迫っており困っています。どなたか教えてください。
No.1
- 回答日時:
データ型は bool , short , char のどれでも構いませんが
配列を 101 取ると 0~100 のフラグとして使用できます
その配列を初期化して(これが重要です)
出た結果をフラグに代入し,次に出た結果のフラグに何か代入されているか
をチェックすれば同じ数字を表示することは防げます
また,表示した個数を数えていれば全ての数字を表示したことがわかります
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.3
- 回答日時:
「rand関数を使え」という指示が無ければ、こんな発想もあります。
1~100迄の値が入った数列を用意して、数字をバラバラに入れ替えれば終わりです。(結局ココにrandを使うことになりますので、ある意味課題クリアです)
プログラム量も非常に短くなりますし、負荷は入れ替えの回数次第で調節できます。
ところで、time関数ってミリ秒が帰ってくると思うのですが、高速CPUでやるとずっと同じ値が帰ってきたりしませんか・・?
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.5ベストアンサー
- 回答日時:
2つの課題が有りますね。
今までにやってみて一番気に入った方法を。(1)実行するたびに同じ並びになったら困る。
time関数を使わなくても srand関数を最初に1回書けば実行するたびに乱数が変わるはずです。
(勝手にtime関数を実行してくれる?)
(2)重ならない乱数を効率よく100個取り出す。
配列を100個用意し、1から100の数字を入れます。
randでそのうちの1個を選んで出力します。仮に48番目とします。
48番目と100番目を入れ替えます。
次に99個の範囲で1つ選んで出力します。仮に35番目とします。
35番目と99番目を入れ替えます。
次に98個の中から・・・
ということを次々に繰り返していけば最後に配列の対象範囲が0になります。
これをチェックしてループを終了すればいい訳です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- その他(データベース) Accessフォームにて指定のフィールドの平均値を小数点第一位で表示できない 2 2022/08/30 17:19
- Excel(エクセル) 【Excel質問】 「本日の日付」から指定条件を満たす営業日経過後の日数を表示させる関数式 3 2022/06/06 23:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使わずに、変数名を動的...
-
2次元配列を戻り値とする関数?
-
先頭アドレスとは何ですか?
-
C言語 配列の長さの上限
-
ExcelVBAで質問です。離れた二...
-
C# 配列の変数宣言について。
-
C# Listを使わずに2次元配列の...
-
unsigned char配列への入力の仕方
-
配列で格納したものをmsgboxで...
-
構造体配列を引数とするDLL作成...
-
Excel、VBAのユーザーフォーム...
-
Redimした動的配列はEraseする...
-
C言語初心者 ポインタについて...
-
VBで構造体の配列を関数に渡す...
-
テキストファイルから文字列を...
-
C言語 配列の再初期化
-
C言語でcharの足し算
-
配列の参照渡しで型が一致しま...
-
なぜ配列は0から始まるのです...
-
VB.NET 構造体の配列の検索機能...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報