C言語のアルゴリズムが思いつきません。
C言語のアルゴリズムが思いつきません。 100個の変数に0を80個、1を20個代入したいのですが、0と1が代入される場所は毎回ランダムに変化させたいのです。何か良い考え方はありますか?
ベストアンサー
アルゴリズムは複数あるのでは、、、、 次に、どのアルゴリズムでも要素数100個の配列を使います。 100個の変数を使うなんて不可能では無いが、それではプログラムを作る必要が無い。 C言語の乱数は重複する数が発生するので重複させない方法が必要になる。 どのアルゴリズムが良いのか知らない。 #include<stdio.h> #include<stdlib.h> #include<time.h> #define MM 100 int main(void) { int i,g,r,d[MM]; srand((unsigned)time(NULL)); for(i=0;i<MM;i++)d[i]=0; g=0; while(1){ r=rand()%MM; if(d[r]==0){ d[r]=1; g++; } if(g==21)break; } for(i=0;i<MM;i++){ printf("%3d",d[i]); if(i%10==9)printf("\n"); } printf("\n"); return 0; } =============== #include<stdio.h> #include<stdlib.h> #include<time.h> #define MM 100 int main(void) { int i,j,r,t,d[MM]; srand((unsigned)time(NULL)); for(i=0;i<MM;i++)d[i]=0; for(i=0;i<20;i++)d[i]=1; for(i=0;i<MM*10;i++){ r=rand()%MM; j=i%MM; t=d[r]; d[r]=d[j]; d[j]=t; } for(i=0;i<MM;i++){ printf("%3d",d[i]); if(i%10==9)printf("\n"); } printf("\n"); return 0; } MM*10は適当です。MMでもMM*MMでも構わない。 =========== 動作はするが未検証です。特にループを抜ける条件に納得できない。 #include<stdio.h> #include<stdlib.h> #include<time.h> #define MM 100 int main(void) { int i,r1,r2,g1,g2,d[MM]; srand((unsigned)time(NULL)); for(i=0;i<MM;i++)d[i]=-1; g1=0; g2=0; while(1){ r1=rand()%MM; r2=rand()%2; if(d[r1]==-1){ if(r2==0&&g1<=80){ d[r1]=r2; g1++; } if(r2==1&&g2<=20){ d[r1]=r2; g2++; }} if(g1==79&&g2==21)break; } for(i=0;i<MM;i++){ printf("%3d",d[i]); if(i%10==9)printf("\n"); } printf("\n"); return 0; }
質問者からのお礼コメント
皆さんありがとうございました! 今の私の知識を使えば理解できる簡潔なコードを回答してくださった方をベストアンサーに選ばせていただきます(本当は1つの回答を選んでベストアンサーにするべきではないかと思いますが仕様上1つしか選べないので)。なお、他の方の回答の考え方も参考にさせていただきます。
お礼日時:2020/11/14 22:47