質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

C言語 複数回ランダム生成するときの配列の中身を全て違うものにしたい

wanwanko
wanwanko

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

2回答

0グッド

0クリップ

434閲覧

投稿2022/10/13 11:07

編集2022/10/13 14:11

前提

C言語で動的配列の時間を10回測ってその平均時間を調べています。
ランダムな数字を生成して、配列に入れるときにあらかじめコードに配列のサイズを指定すると、一つ一つの配列の中身が全く同じになってしまいます。ランダムな数を生成するときに自分で配列のサイズを入力するときは配列の中身は全て違うものになります。
その理由はなぜですか。
10回分自分でサイズの入力をしなくてもいい方法はありますか。

参考にしたコード
https://www.scaler.com/topics/pow-function-in-c/

実現したいこと

サイズを予め指定し、且つ、一つ一つの配列の中身を違うものにしたい。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4#include <time.h> 5 6int main() { 7 8 clock_t cpu_time_start; 9 clock_t cpu_time_end; 10 double sec_start; 11 double sec_end; 12 double result_time; 13 double time_ave,time_cl=0; 14 int k,sum=0;  //ここのkを仮に、予めk=2と指定すると以下の配列の中身は全て同じになる。 15 16 for(int ii=0;ii<10;++ii){ 17 printf("Size of the array: "); 18 scanf("%d", &k); //この場合は自分で入力するので、配列の中身は一つ一つ違うものになる。 19 int n = pow(2, k); 20 int *arr = calloc(n, sizeof(int)); // Creating enough space for 'n' integers. 21 if (arr == NULL) { 22 printf("Unable to allocate memory\n"); 23 return -1; 24 } 25 //printf("Enter the elements (space/newline separated): "); 26 srand(time(NULL)); 27 for (int i = 0; i < n; i++){ 28 arr[i] = rand() % 10 + 1; // Notice that, (arr + i) points to ith element 29 sum+=arr[i]; 30 } 31 printf("Given array: "); 32 for (int i = 0; i < n; i++) 33 printf("%d ", *(arr + i)); // Dereferencing the pointer 34 35 printf("\n"); 36 37 cpu_time_start = clock(); 38 sec_start = (double)cpu_time_start/CLOCKS_PER_SEC; 39 40 printf("Modified Array: "); 41 for (int i = 0; i < n - 1; i++) 42 printf("%d ", arr[i]); 43 printf("\n"); 44 45 free(arr); 46 printf("Sum of Array is %d\n",sum); 47 cpu_time_end = clock(); 48 sec_end = (double)cpu_time_end/CLOCKS_PER_SEC; 49 result_time = sec_end - sec_start; 50 51 printf("処理時間 : %f\n",result_time); 52 53 time_cl+=result_time; 54 } 55 time_ave = time_cl/10; 56 printf("%lf",time_ave); 57 return 0; 58} 59 60 61

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jimbe

2022/10/13 11:38

コードはコードのマークダウンをご利用ください。 マークダウンに関しましてはヘルプを参照してください。
y_waiwai

2022/10/13 11:42

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください

回答2

1

とりあえず srand(time(NULL)); は for の外に出したほうが良いでしょう。

投稿2022/10/13 12:00

jimbe

総合スコア10808

wanwanko👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

ベストアンサー

srandの使い方をちょっと間違えています
srandで指定した数値は乱数のタネとなって、ここで同一のタネが与えられた場合は、これ以降の乱数の生成列は同一となります

ってことで、
srand(time(NULL));
time関数は、1秒間の間は同一の値しか返しません

投稿2022/10/13 11:53

編集2022/10/13 11:57
y_waiwai

総合スコア86052

wanwanko👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。