ページ 1 / 1
乱数
Posted: 2010年1月13日(水) 01:30
by xxx
是非作っていただきたいプログラムがあります。
①乱数発生プログラム
0から100までの整数乱数を1000個以上発生させ、それを標準出力またはファイルに書き出すプログラム
②データ解析プログラム
①の乱数発生プログラムで作成した整数乱数データファイル(データ数1000個以上)を読み込んで、次の愛田を出力する。
・最大値と最小値
・平均値(小数点以下一位まで)
・度数分布表(0~9、10~19、…、90~100の区間に分けて、吐く区間にいくつデータがあるかを表示)
よろしくお願い致します。
Re:乱数
Posted: 2010年1月13日(水) 01:35
by Ma
まる投げ禁止です。
環境をかいてください。
規約を読んでください。

Re:乱数
Posted: 2010年1月13日(水) 01:45
by xxx
すみません。
ただ、Cプロが全く分からないので、自分ではどうすることもできません。
皆さんに教えてもらって、そのことを理解し勉強していこうと考えています。
よろしくお願い致します。
特に平均値・分布が分かりません。
Re:乱数
Posted: 2010年1月13日(水) 02:00
by Ma
略語、誤字はできるだけさけてください・・・。
>愛田 ⇒ 間
>吐く区間 ⇒ 各区間
>Cプロ ⇒ Cでプログラミング ?
それはいいとして。
少しでもグーグルで検索してみようとしてください。
「C 乱数」と検索してちょっと読むだけで、いろんなサンプルが見つかるものです。
http://www005.upp.so-net.ne.jp/h-masuda ... and01.html
以下のコードはこちらのサイト様からコードを利用させていただき、ちょこっと編集したものです。
①については、
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int n, rnd;
srand(time(NULL)); /* 乱数の初期化 */
for(n = 0; n < 1000; ++n){
rnd = rand()%101; /* 乱数の取得 */
printf("%d\n", rnd); /* 乱数の表示 */
}
return 0;
}
平均値については、すべてのデータを配列に保存しておき、すべてを足し、足した数で割ったものを double 等に足せばOKです。
たとえば、
int data[100];
に乱数が保存されているなら
int sum = 0;
for(n = 0; n < 100; ++n){
sum += data[n]
}
double ave = (double)sum/100;
みたいな形になります。
(一部コーディングミスで修正しました。)

Re:乱数
Posted: 2010年1月13日(水) 02:12
by Poco
C言語については、どこまで教わったのでしょうか?
教わった範囲を列挙してください。
列挙した項目ごとに、何が分からないかを明記してください。
これは回答者全員がxxxさんに教えるために必要な情報です。
これがないと、回答者が的はずれな回答をしてしまい、無駄なやり取りが
発生します。
よろしくお願いします。
Re:乱数
Posted: 2010年1月13日(水) 02:13
by Poco
> 略語、誤字はできるだけさけてください・・・。
> >愛田 ⇒ 間
×愛田
○値
ではないかと。
Re:乱数
Posted: 2010年1月13日(水) 02:16
by Ma
>ぽこさん
あー、なるほど。訂正ありがとうございます。
間ってちょっと変だなぁと思ってたので、ようやく正しく理解できました。
度数分布表に関しては、
データの値を10で割り、その商がいくつであるかによってどの区間にあるかを求めます。
つまり
int range[10] = {0,};
for(int i = 0;i < 1000; i++){
range[data
/10]++;
}
for(int i = 0; i < 10; i ++){
printf("%d番目の区間には、%d だけデータが当てはまりました。\n",i,range);
}
こんなかんじに。 
Re:乱数
Posted: 2010年1月13日(水) 02:31
by xxx
皆様ありがとうございます。
誤字は申し訳ありません。
愛田→値
吐く区間→各区間
Cプロ→Cプログラミング
学習は、乱数を作るプログラムを触る感じでしかやっておりません。
なので、読み込みなどもいまいちわかりません。
scanfなどは使わないのでしょうか?
Re:乱数
Posted: 2010年1月13日(水) 02:38
by Ma
>学習は、乱数を作るプログラムを触る感じでしかやっておりません。
>なので、読み込みなどもいまいちわかりません。
>scanfなどは使わないのでしょうか?
scanf は、コマンドからの入力です。
ファイルからの入力の場合、いくつかの方法があります。
(ファイルへの出力も同様)
詳しくは、グーグルで「ファイル入出力 C」などで調べてください。
聞いたところ、まだ初めて間もないようなので、先ほどのコードが理解できないようならば
先にC言語入門サイトをこなすことをおすすめします。
入門サイトの中には、ファイル入出力も教えてくれるものがあるとおもいますよ。
なにより、こういうサイトは順番に説明してくれているでしょうから。
Re:乱数
Posted: 2010年1月13日(水) 08:02
by light
是非作ってほしいプログラムがあるって、これ宿題じゃないんでしょうか?
Re:乱数
Posted: 2010年1月13日(水) 12:25
by たかぎ
とりあえず一つ目
#include <algorithm>
#include <ctime>
#include <fstream>
#include <iostream>
#include <iterator>
#include <boost/random.hpp>
void generate(std::ostream& ostr)
{
boost::mt19937 gen(static_cast<unsigned long>(time(0)));
boost::uniform_smallint<> dst(0, 100);
boost::variate_generator<
boost::mt19937&, boost::uniform_smallint<>
> rand(gen, dst);
std::generate_n(std::ostream_iterator<int>(ostr, "\n"), 1000, rand);
}
int main(int argc, char* argv[/url])
{
std::ostream* ostr;
if (argc < 2)
{
ostr = &std::cout;
}
else
{
static std::ofstream ofs(argv[1]);
ostr = &ofs;
}
generate(*ostr);
}
いつものようにコメントなしですので、自分で解析してください。
Re:乱数
Posted: 2010年1月13日(水) 15:44
by xxx
ありがとうございます。
最大値、最小値までできました。
ここに平均値と分布を加えたらよいと思うのですが、どこにどのような文字を入れればいいのでしょうか?
よろしくお願いいたします
#include <stdio.h>
#include <stdlib.h>
#define N 2000
int main(void)
{
FILE *fp;
int data[N], i, min, max;
fp=fopen("random.txt", "r");
min=max=data[0];
for (i=0; i<N; i++) {
if (min > data) min=data;
if (max < data) max=data;
printf("%d ", data);
if (i % 10 == 9) printf("\n");
fprintf(fp, "%d\n", data);
}
printf("Min value is %d.\n", min);
printf("Max value is %d.\n", max);
fclose(fp);
return 0;
}
Re:乱数
Posted: 2010年1月13日(水) 16:02
by Mist
> 最大値、最小値までできました。
ぜんぜん出来てませんけど。
①乱数発生プログラム
②データ解析プログラム
は別のプログラムであることを理解していますか?
Re:乱数
Posted: 2010年1月13日(水) 18:13
by Dixq (管理人)
これは友達に見せてもらったプログラムですか?
自分ではどこまで理解出来ていますか?
一つ一つ意味を理解していきましょう。
上のプログラムに一行ずつ詳しく注釈を書いていってみてください。
その注釈を見ればどこで勘違いしているか解ると思います。
また、全ての行を理解すれば今の疑問も晴れるはずです。
まずはなるべく詳しくプログラムコードに注釈を書いていってみてください。
例えば・・
// Nを2000と定義する ← ×
#define N 2000
// ○○の△△としてNを2000と定義する ← ○
#define N 2000
// fpを用意する ← ×
FILE *fp;
// ファイルからデータを読み込むため、ファイルポインタfpをFILE*型で用意する ← ○
FILE *fp;
こんな感じです