- ベストアンサー
初心者のための関数の説明とSortの問題
- 初心者向けの関数の説明とSortの問題について解説します。
- NumberCOM関数は重複のない30個の乱数を生成し、配列に格納して表示します。
- Sort関数は配列COMとMANの要素を小さい順に並べ替えて表示しますが、Sortした後のCOM配列の要素数が正しくない場合があります。これの解決策についても説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★重複を避ける部分がおかしいです。 ・重複を避ける処理を入れているのにその中で発生させた乱数は重複のチェックを 行っていません。また、その乱数を com[a]、com[b] の2つに代入しています。 この時点で重複データを避ける処理になっていません。無意味でしょうが…。 ・私なら下のようにしますけど。参考に。 サンプル: // 重複チェック用 int DoubleCheck( int *com, int size, int check ) { int i; for ( i = 0 ; i < size ; i++ ){ if ( com[i] == check ){ return 1; // 重複あり } } return 0; // 重複なし } // 乱数 int NumberCOM( int *com, int size ) { int i; srand( 0475u ); for ( i = 0 ; i < size ; i++ ){ do { com[ i ] = (rand() / (RAND_MAX + 1.0) * 100); } while ( DoubleCheck(com,i,com[i]) ); printf( "%d,", com[i] ); } printf( "\n" ); return 0; ←これ忘れずに(戻り値が int で宣言しているから) } その他: ・上記のサンプルのように『重複チェック関数』を作った方が処理がわかりやすくなると思います。 重複の処理は NumberCOM() 関数の do-while 文で行っています。 重複があると DoubleCheck() 関数で 1 が返されるため do-while 文を繰り返して新しい乱数を com[i] にセットします。その後に重複しなくなるまで do-while 文を繰り返します。 ・以上。参考に。
その他の回答 (2)
- yaemon_2006
- ベストアンサー率22% (50/220)
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int work[100]; int i, j, temp; srand((unsigned)time(NULL)); for(i = 0; i < 100; i ++) work[i] = i; for(i = 99; i > 1; i --){ j = ((double)rand() / RAND_MAX) * i ; temp = work[j]; work[j] = work[i]; work[i] = temp; } for(i = 0; i < 100; i ++) printf("%d ", work[i]); return 0; }
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
NumberCOMが生成した値に重複があります。
お礼
恥ずかしながら、関数に関して間違った解釈をしてました。 ご指摘ありがとうございます。 それにgood ideaまで出していただいて。 参考になりました。 これからは、複雑になったら分けるというのを基本にします。