C言語のアルゴリズムが思いつきません。

ベストアンサー

0

ThanksImg質問者からのお礼コメント

皆さんありがとうございました! 今の私の知識を使えば理解できる簡潔なコードを回答してくださった方をベストアンサーに選ばせていただきます(本当は1つの回答を選んでベストアンサーにするべきではないかと思いますが仕様上1つしか選べないので)。なお、他の方の回答の考え方も参考にさせていただきます。

お礼日時:2020/11/14 22:47

その他の回答(6件)

0

問題の値は配列に格納する、という前提で。 配列result(長さ100)を全部0で初期化する。 0から99までを値として持つ長さ100の別の配列indexesを作る。 --以下20回繰り返し 0以上indexesのサイズ-1以下の整数を乱数で生成する(以下x)。 result[indexes[x]]を1にする。 indexes[x]を削除して要素を前に詰める。 --繰り返しここまで まぁ、要するに、ビンゴで言うボールに相当する変数を作れという話だ。

0

0. 100個の変数 って、100個の変数名 じゃないっすよね? あり得ない。 1. 私なら、Hermitさんと同じ作戦でいきます。 乱数=>インデックス 作戦じゃ、20個になる保証がない。 かといって、20個になるまで検査リトライ を繰り返すのは、 本末転倒な気がする。 #include <stdlib.h> #include <time.h> #include <stdio.h> // [0, n) int uniform_rand(int n) {     return rand() / (RAND_MAX / n + 1); } void swap(int* x, int* y) {     const int tmp = *x; *x = *y; *y = tmp; } // Fisher-Yates shuffle void shuffle(int* v, size_t len) {     for (size_t i = len - 1; i > 1; --i)         swap(v + i, v + uniform_rand(i)); } int main(void) {     srand(time(NULL));     int v[100] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};     const size_t N = sizeof(v) / sizeof(v[0]);     shuffle(v, N);     for (size_t i = 0; i < N; ++i) printf(" %d", v[i]);     putchar('\n'); }

0

#include <stdio.h> #include <time.h> #include <stdlib.h> int main() { int a[100]= {0}; int i,r; srand((unsigned)time(NULL)); for(i=0; i<20; i++) { r=rand()%100; a[r]=1; } for(i=0;i<100;i++){ printf("%4d",a[i]); if((i+1)%10==0)puts(""); } return 0; }

訂正: for(i=0; i<20; i++) { r=rand()%100; a[r]=1; } ↓↓↓↓↓↓↓↓↓ i=0; while(i<=20){ r=rand()%100; if(a[r]==0){ a[r]=1; i++; } }

0

こんなのが定番かな? #include <stdio.h> #include <stdlib.h> void shuffle(char *p, size_t n) {     for (int i = 0; i < n; i++) {         size_t t = rand() % n;         char tmp = p[i];         p[i] = p[t];         p[t] = tmp;     } } int main(void) {     srand(time(NULL));     char arr[100] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};     for (int i = 0; i < sizeof arr; i++) printf("%d ",arr[i]);     putchar('\n');     shuffle(arr, sizeof arr);     for (int i = 0; i < sizeof arr; i++) printf("%d ",arr[i]);     return 0; }

rand() の精度がいいなら、 void shuffle(char *p, size_t n) { while (n) { size_t t = rand() % n; char tmp = p[--n]; p[n] = p[t]; p[t] = tmp; } } に。