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

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

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

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

Q&A

解決済

2回答

543閲覧

c言語の乱数について

nikiita

総合スコア1

C

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

0グッド

0クリップ

投稿2023/05/21 07:35

実現したいこと

cで乱数が変化するようにしたい

前提

ここに質問の内容を詳しく書いてください。
(例)
3つのx,y座標をもった構造体のリストを作成するプログラムを書いています。
リストの要素は5です。
3つの座標をランダムに発生させたいのですが
三角形のアドレス:7673392
0:x=404.470870 y=381.138218
1:x=404.470870 y=381.138218
2:x=404.470870 y=381.138218

三角形のアドレス:7673584
0:x=510.618854 y=10.476547
1:x=510.618854 y=10.476547
2:x=510.618854 y=10.476547

というように要素ごとには違う値が入っているのですが座標ごとには同じ値が入っています。
srand((unsigned int)time(NULL));
の挿入位置の問題とはわかっているのですが様々な場所に変更したり増やしたりしても改善されなかったのでご助言頂きたいです。

該当のソースコード

c

1#include<stdio.h> 2#include<string.h> 3#include<stdlib.h> 4#include <ctype.h> 5#include<conio.h> 6#include<math.h> 7#include <time.h> 8#include <unistd.h> 9#define N_MIN 3 10#define N_MAX 100 11#define ZAHYO_MIN 55.0 12#define ZAHYO_MAX 550.0 13 14struct zahyo{ 15 double x; 16 double y; 17}; 18typedef struct zahyo Coordinate; 19 20 21struct sankaku{ 22 Coordinate v[3]; 23 struct sankaku *next; 24}; 25typedef struct sankaku Triangle; 26 27Triangle *node_malloc(Triangle *random,int n,int i){ 28 Triangle *a = (Triangle*)malloc(sizeof(Triangle)); 29 a = random; 30 31 for(int b=0; b<3;b++){ 32 a->v[b].x=(double) fmod(rand(),(ZAHYO_MAX - ZAHYO_MIN + 1.0) + ZAHYO_MIN) + (double)rand()/RAND_MAX; 33 a->v[b].y=(double) fmod(rand(),(ZAHYO_MAX - ZAHYO_MIN + 1.0) + ZAHYO_MIN) + (double)rand()/RAND_MAX; 34 } 35 36 if(n>i){ 37 Triangle *b = (Triangle*)malloc(sizeof(Triangle)); 38 a->next=b; 39 a->next=node_malloc(a->next,n,i+1); 40 } 41 42 return a; 43 44} 45 46int main(){ 47 int i=1; 48 int n=5; 49 srand((unsigned int)time(NULL)); 50 Triangle *sankaku; 51 52 sankaku = (Triangle*)malloc(sizeof(Triangle));//領域の確保 53 sankaku=node_malloc(sankaku,n,i); 54 55 while(sankaku->next!=NULL){ 56 printf("三角形のアドレス:%d\n",sankaku); 57 for(int j=0; j<3; j++){ 58 printf("%d:x=%f y=%f\n",j,sankaku->v[i].x,sankaku->v[i].y); 59 } 60 puts("\n"); 61 sankaku=sankaku->next; 62 } 63 return 0; 64 65} 66

試したこと

srand((unsigned int)time(NULL));
を31行目の次に挿入したがむしろ全ての座標が同じ乱数になった

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

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

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

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

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

guest

回答2

0

ベストアンサー

58行目のソースですが

c

1 printf("%d:x=%f y=%f\n",j,sankaku->v[i].x,sankaku->v[i].y);

ではなく

c

1 printf("%d:x=%f y=%f\n",j,sankaku->v[j].x,sankaku->v[j].y);

ではないでしょうか。(v[i]v[j])

投稿2023/05/21 08:06

actorbug

総合スコア2224

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

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

nikiita

2023/05/21 08:29

おっしゃる通りです。。。 デバック用にあるループから別のループにprintf文を移動させた時に変数を変えるのを失念しておりました。 変更したところ、それぞれの座標が別の乱数になりました。 乱数が変化しない=srand()のミスであると決めつけて視野が狭くなっていました。 ありがとうございます。
guest

0

C

1Triangle *node_malloc(Triangle *random,int n,int i){ 2 Triangle *a = (Triangle*)malloc(sizeof(Triangle)); // メモリを確保し、そのアドレスをaに保持しておきながら 3 a = random; // わざわざそれを書き潰す 4 ...

...なにがしたかったのでしょう?

投稿2023/05/21 07:59

episteme

総合スコア16614

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

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

nikiita

2023/05/21 08:34

当方、ポインタと動的なメモリ確保の理解が足りておらず色んなサイトを見よう見まねで書いてエラーがでたり思わぬ挙動になればその都度書き直す,,,という書き方をしているため有識者の方から見れば意図がわからない・気持ち悪いコードを書いているかもしれません。申し訳ないです。 ご指摘を受けた箇所は今回出た不具合はちゃんとa=randomをするだけでaが確保されてるか心配で過剰な書き方をしてしまった,,,という感じです(伝わらなかったら申し訳ございません)
episteme

2023/05/21 08:41

> a=randomをするだけでaが確保されてるか心配で過剰な書き方をしてしまった,,, mallocで確保した領域はfreeせぬ限り解放されんので、解放されぬままメモリ内に居座ります。やっちゃダメです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問