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

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

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

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

Q&A

解決済

2回答

840閲覧

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

wanwanko

総合スコア14

C

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

0グッド

0クリップ

投稿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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/10/13 11:38

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

2022/10/13 11:42

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

回答2

0

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

投稿2022/10/13 12:00

jimbe

総合スコア12659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

投稿2022/10/13 11:53

編集2022/10/13 11:57
y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問