回答受付が終了しました

ID非公開

2021/10/14 7:23

44回答

乱数メーカーで、例えば1から24の数字を重複せずに2つずつ、計48個発生させる方法はありますか?

数学 | C言語関連849閲覧

回答(4件)

0

(ID非公開) 例: #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i,j,k,t; int d[48]; srand((unsigned)time(NULL)); for(i=1,j=0;i<=24;i++){ d[j]=i; j++; d[j]=i; j++; } for(i=0;i<100;i++){ j=rand()%48; k=rand()%48; t=d[j]; d[j]=d[k]; d[k]=t; } for(i=0;i<48;i++){ printf("%d ",d[i]); } puts(""); return 0; }

0

24個の乱数を二組ってことで。 #include <stdio.h> #include <stdlib.h> #include <time.h> //Compiler version gcc 6.3.0 #define N 24 #define M 2 void fillrand(int,int []); int main() { int nums[M][N]; srand((unsigned int)time(NULL)); for (int i = 0;i < M;i++) { fillrand(N,nums[i]); } for (int i = 0;i < M;i++) { for (int j = 0;j < N;j++) { nums[i][j]++; } } for (int i = 0;i < M;i++) { for (int j = 0;j < N;j++) { printf("%2d ",nums[i][j]); } printf("\n"); } return 0; } void fillrand(int n,int nums[n]) { int rands[n]; for (int i = 0;i < n;i++) { rands[i] = i; } for (int i = 0;i < n;i++) { int r = (int)((double)rand() / RAND_MAX * (n - i)); int count,j; for (j = count = 0;count <= r;j++) { if (rands[j] != -1) { count++; nums[i] = rands[j]; } } rands[j - 1] = -1; } } ------- 20 15 5 8 22 14 21 12 11 17 19 10 1 3 24 4 9 16 13 18 6 2 23 7 12 18 22 8 23 3 1 17 16 6 4 14 21 24 5 10 15 20 19 11 2 13 9 7 Process finished.

0

知恵袋を検索すれば色々出てくると思いますが、以下の方法がよく出てくると思います(別に私が発明したわけではない)。 (r₀, n₀) (r₁, n₁) (r₂, n₂) : (r₄₇, n₄₇) の48個のデータ列を用意します。 rは乱数です。nは1, 1, 2, 2, 3, 3, …, 24, 24を設定します。 48個のデータ列を乱数部分を使って整列させます。 先頭から順番に48個のnを取り出します。

ID非公開

質問者2021/10/14 8:25

コンピュータでできますかね?