• ベストアンサー

rand関数について

rand関数で取得した乱数を入力し、入力した逆の順番に表示しなさい、という問題があるのですが。一度乱数のプログラムを作り、その後逆に表示するプログラムというのは分かるのですが、そのあとがどうしても分かリません。 一般に、この場合は先ず。 #include <stdio.h> #include <stdlib.h> int main(void) { int i; for(i=1;i<==10;i++){ printf("%d",rand()%10+1); { return 0; } の表示をして、新たに逆にする表示をすると思うのですが、どのパターンを使うのが無難なのでしょうか? できれば 式を含めてお願いします。

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

  • ベストアンサー
  • weiss09
  • ベストアンサー率45% (20/44)
回答No.1

配列作って、その中に保持しておけば大丈夫です。 int main(void) { int i; int v[10]; // 値を保存するための配列 for(i=0;i<=9;i++){  v[i]=rand()%10+1; } for(i=9;i>=0;i--){  printf("%d\n",v[i]); } return 0; } テストしてないので見落としなどあるかもしれませんがご容赦を。

sheran
質問者

補足

詳しい説明ありがとうございます。 何とか実行できました。 それでですが、この問題の場合求める擬似乱数の逆に表示したい場合、 最初に求める乱数が137866975と表示されるのですが逆は579668731とひょうじする方法でなくてもよくて、 5 7 9 6 6 8 7 1 3 という表示が正という考えでも良いということなのでしょうか? よろしくお願いします。

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#3>外部シンボル'_printf_rand'が未解決。error1、と表示されるのですがこの場合の原因はどこにあるのでしょうか? すでに#4で回答されていますが、 printf_rand って関数が使われているけど、ソースの中で、定義もされてなきゃ、リンクもされていないよぉ ってことです。 #3のプログラムでは、printf_rand という関数は使っていないので、 おそらく、関数の名前を変更されたのだと思いますが、定義の方も変更して(printf_rand か print_rand に)統一する必要があります。 あと、#5と同じ理由で改行するようにしてあります。

sheran
質問者

お礼

回答ありがとうございました。 何とか解決できました。 返答遅くなり申し訳ありませんでした。 ありがとうございました。

  • weiss09
  • ベストアンサー率45% (20/44)
回答No.5

No1です。 printf("%d\n",v[i]); \nが改行コードですので、この場合は出力1回ごとに改行されるようにしてます。 rand()%10+1だと1~10までの値を取るので、改行しないとごちゃごちゃになるかなと思い、付け加えたものです。 (注記した方が良かったですね(^_^;) 要は逆順で表示すれば良いので、改行してもしなくてもいいと思いますよ。 ただ、数値と数値の区切りは明確にした方が良いと思います。 このあたりは「どういう目的で組むのか」ということで。

sheran
質問者

お礼

回答ありがとうございました。 あれから、無事解決できました。 ありがとうございました。

回答No.4

> 外部シンボル'_printf_rand'が未解決。error1、と表示されるのですがこの場合の原因はどこにあるのでしょうか? × printf_rand ○ print_rand

sheran
質問者

お礼

ご指摘ありがとうございました。 何とか解決できました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#include <stdio.h> #include <stdlib.h> void print_rand(int n){ int r; if(n==0){ printf("\n"); return ; } r=rand()%10+1; printf("%d\n",r); print_rand(n-1); printf("%d\n",r); } int main(void){ print_rand(10); return 0; }

sheran
質問者

補足

詳しい回答ありがとうございます。 実際上に説明してくださった通りにやって見たのですが、外部シンボル'_printf_rand'が未解決。error1、と表示されるのですがこの場合の原因はどこにあるのでしょうか? もし宜しかったらお願いします。

回答No.2

まず、いったん何らかのデータ構造に入れましょう。 最大数がわかっているなら配列がいいですかね。 int data[1000]; int save_num = 255; int i; for(i = 0; i < save_num; i++){ data[i] = rand(); } // 配列データに乱数がsave_num個入力される。 // 保存した配列を後ろから前に出力していく。 for(i = 255; i != -1; i--){ printf("%d,",data[i]); } こんな感じでいいでしょう。 おもしろい実装としては、再帰呼び出しで void Print(int data[],int n){ if(n == 0) printf("%d,",data[0]); else{ Print(data,n-1); printf("%d,",data[n]); } } こんな感じですかね。

sheran
質問者

お礼

返事が遅くなってしまいまして申し訳ありません。 早速実行してみます。 詳しい説明をありがとうございます。

sheran
質問者

補足

実行し無事実行できました。 今まで思いつかなかったので、非常に役に立ちました。 また、質問する事があればよろしくお願いします。 ありがとうございました。

関連するQ&A

  • RAND_MAXの最大値について

    /* YouTubeのC入門系動画に乱数の話があり真似てみたところ、動画では2147483647まで出力されているのですが、 私の環境では32767までしか出力されません。 この最大値の違いは、どうして出るのでしょうか? また、私の環境で最大値2147483647まで出せるようになりますか?または、出せる方法があるなら教えてください。 よろしくお願いします。 */ cpu i5 3570 memory 32GB OS Windows 10 pro 64bit Microsoft Visual Studio Community 2015 */ #include <stdio.h> #include <stdlib.h> int main(void) { printf("MAX : %d\n", RAND_MAX); return 0; }

  • プログラミングについて

    以下のプログラムをコンパイル、実行しようとするとコアダンプと表示されてしまいます。 おそらく配列がうまくいっていないというのは察したのですが、どううまくいっていないのかがわかりません。 原因を教えていただきたいです。 このプログラムは、Nを入力し、0~100までの乱数をN個表示させるものです。 配列を使っているのは、このプログラムが完成したのち、改良してその乱数同士を計算するプログラムにしたいためで、その途中段階でした。 環境は、Cygwinです。 ―――以下ソースコード――― #include <stdio.h> #include <math.h> #include <stdlib.h> int main(void){ int i,N; double u[N]; int ransu; printf("Define N : \n"); //得たい乱数の数を設定 scanf("%d",&N); for(i = 0; i < N; i++) { ransu = rand() % 101 ; //0~100までの乱数を得る u[i] = (double) ransu; printf("%.0f ", u[i]); } printf(" \n"); return 0; } 教えていただける方、いらっしゃいましたら教えていただきたいです。よろしくお願いします。

  • 毎回違う乱数を生成するにはどうしたらいいでしょうか

    C言語の初心者です。よろしくお願いいたします! 乱数に関する質問:毎回違う乱数を生成するにはどうすればいいでしょうか。 学校の講義の中に  >>time() は1970 年1 月1 日0 時0 分(標準時)からの経過秒数を返 すため,1 秒以内に何度も実行すると,同じ数字で乱数を初期化す ることになり,結果も同じになってしまう. という記述がありますが、時間を置いてから、実行しても同じ結果となりました。 その一 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x,y; int i,index=0; double a,n; printf("How many trials?..."); scanf("%lf",&n); for (i=0;i<n;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1) index++;} a=4*index/n; printf("Result is %.2f(%.2f)",a,sin(-a)); return 0; } その二 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; srand((unsigned)time(NULL)); a=(int)(rand()/(RAND_MAX+1.0)*10); printf("%d\n",a); return 0; } お忙しい中、教えていただけたらうれしいです。

  • サブ関数、メイン関数

    C言語の質問です! ランダムに九九の計算を出題して、キーボードから答えを入力し、正解かどうかを判定するプログラムをつくりたいです。出題の部分をサブ関数、判定の部分をメイン関数として作成する場合、どのようなプログラムの書き方になるのか、教えてください! #include<stdio.h> #include<stdlib.h> #include<process.h> void kakezan(void); void answer(void); void hanrei(void); int a,b,c; int main() { printf("やめるときは、100と入力してください。\n");   while(1){ kakezan(); answer(); hantei(); } return 0; } void kakezan(void) { a=rand() %10; b=rand() %10; printf("%d×%d=",a,b); } void answer(void) { scanf("%d",&c); if(c==100) exit(0); } void hantei(void) { if(c==a*b) printf(">>正解\n"); else printf(">>不正解\n"); printf("\n"); return; } 一応考えてみたのですが、 ちゃんと、判定→メイン  出題→サブ関数になっているのかなとおもって・・・   このプログラムであっているのでしょうか??

  • C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると

    C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると結果が130固定となってしまいます。 #include <stdio.h> #include <stdlib.h> int main(void){ int x; x = rand(); printf("%d",x); return 0; } 使っているコンパイラはBorland C++ 5.5.1です。何か間違いでもあるのでしょうか?よろしくお願いします。

  • 乱数について

    C の入門書を1冊読み終え、簡単なプログラムを作成しようとしているのですが、 早速分からないことが出たので教えて頂ければと思います。 --------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int num; int i = 0; while( i < 4 ){ srand(time(NULL)); num = rand()%100; printf("%d\n", num); i++; } return 0; } --------------------------------------------- 上記を実行したのですが、秒数を乱数の種としているため4回とも同じ値を取得してしまいます。 より高精度に秒数を取得することは可能でしょうか? もしくはこのようなかたちで4回ともに異なる数を得ることが出来る方法がありましたら教えて頂きたいと思います。

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • 乱数発生

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

  • 乱数について

    Visual Studio2008を使っています。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i; srand(time(NULL)); i=rand(); printf("%d\n",i); return 0; } 乱数を作るために上のようなプログラミングを作りました。 これを「ソリューションのビルド」すると 【warning C4244: '引数' : 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。】 と出ます。 このまま行っても乱数が出来るのですが どうしたらいいのでしょうか? 8行目を srand(time_t(NULL)); srand((unsigned)time(NULL)); と変えればいいのでしょうか? time_tでやると乱数が同じ値しか出てきません。 教えてください。

  • srand(time(NULL))の使い方

    C言語の勉強中で「ランダムな整数値を作成し、その数値が偶数か奇数かを判定するプログラムをif~else 構文を使って作成」したいのですが下記のプログラムでやってみたのですがまだまだ知識不足で完成しません。知識をお借りできればと思っていますのでどなたか教えてください。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { { int = i; i = rand(); srand((unsigned)time(NULL)); printf("%d\n",rand()); } if(i % 2 == 0) { printf("偶数である:\n",i); } else { printf("奇数である:\n",i); } return 0; }

専門家に質問してみよう