OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

乱数表示のプログラム

  • すぐに回答を!
  • 質問No.241655
  • 閲覧数911
  • ありがとう数0
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 0% (0/10)

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

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

  • 回答No.5
レベル14

ベストアンサー率 30% (2593/8599)

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

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

その他の回答 (全4件)

  • 回答No.1
レベル9

ベストアンサー率 32% (26/79)

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

ベストアンサー率 28% (6/21)

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

お礼率 0% (0/10)

 早速の解答ありがとうございます。すごく分かりやすいた例えでありがたいです。しかし現在の私の能力では具体的にどうプログラミングしたらよいかどうしても分かりません。選ぶボールを減らしていく方法を教えてください。
投稿日時 - 2002-03-26 13:52:17
  • 回答No.3
レベル12

ベストアンサー率 47% (330/699)

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

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

ところで、time関数ってミリ秒が帰ってくると思うのですが、高速CPUでやるとずっと同じ値が帰ってきたりしませんか・・?
  • 回答No.4
レベル7

ベストアンサー率 18% (3/16)

プログラミングはできるだけ自分の力でやった方がいいですよ。 ゆくゆく苦労してしまいますから。 たとえ自分でやったとして効率の悪いのができたとしても はるかにためになりますから。 今回はお困りのようなのでちょっとだけ力になります。 void main(void) { int num[100] = {1,2,3,4,5,6,7,8,9,10,11.....100}; int ...続きを読む
プログラミングはできるだけ自分の力でやった方がいいですよ。
ゆくゆく苦労してしまいますから。
たとえ自分でやったとして効率の悪いのができたとしても
はるかにためになりますから。
今回はお困りのようなのでちょっとだけ力になります。

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

これでできませんかね?
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ