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

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

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

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

Q&A

解決済

4回答

2618閲覧

乱数の種について、srand(),srand48()

zyunnsuke

総合スコア4

C

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

0グッド

0クリップ

投稿2021/12/15 03:33

編集2021/12/15 04:00

今、(1,1)の座標内に指定個数の点を打ち込むプログラムを作成しています。
試行ごとに異なる結果を得るために、乱数の種を用いようと考えているのですが、
使用方法がいまいちピンときません。

乱数の種をtime関数を用いて取得し、srand(time_t)のような形main文で指定して
それを別関数に送って送った関数内で使いたいのですがうまく行かないです。

プログラム

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#define N 1000 5 6typedef struct{ 7 double x; 8 double y; 9}Location; 10 11void random_points(int n,Location loc[],time_t tp){ 12 int i=0; 13 for(i=0;i<n;i++){ 14 loc[i].x = (double)srand48(tp); 15 loc[i].y = (double)srand48(tp); 16 printf("loc[%d].x = %f\n", i ,loc[i].x); 17 printf("loc[%d].y = %f\n", i ,loc[i].y); 18 } 19} 20 21int random_shuffle(int n){ 22 int i=0; 23 int j; 24 for(i=0;i<n;i++){ 25 j = rand() % 101; 26 printf("i = %d",j); 27 } 28} 29 30int main(void){ 31 double d[N][N]; 32 int n; 33 time_t tp; 34 time(&tp); 35 srand(tp); 36 Location loc[N]; 37 scanf("%d", &n); 38 random_points(n,loc,tp); 39 random_shuffle(n); 40}

エラー
rand_practice.c: 関数 ‘random_points’ 内:
rand_practice.c:14:9: エラー: void 式の無効な使用法です
loc[i].x = (double)srand48(tp);
^
rand_practice.c:15:9: エラー: void 式の無効な使用法です
loc[i].y = (double)srand48(tp);
^

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

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

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

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

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

BeatStar

2021/12/15 03:39

自作の関数名が違いますよ。
zyunnsuke

2021/12/15 04:00

有難うございます。
thkana

2021/12/15 11:48

そもそも「乱数の種」とはどういうものとお考えでしょうか。 > それ(乱数の種ですね?)を別関数に送って送った関数内で使いたい どのように/何に使いたいのですか?
zyunnsuke

2021/12/15 17:04

乱数の種を設定する意味をいまいちわかっておらず、この質問をしました。 今は、プログラム実行毎に一度main関数内で与えれば良いと考えています。 実行ごとに違う結果が得られれば良いと考えているので。
thkana

2021/12/15 22:52

乱数の作り方、例えばよく使われる「線形合同法」あたりについて調べてみると理解が深まるかもしれません。
guest

回答4

0

ベストアンサー

乱数を求めるのは、srand48じゃなくてdrand48です。

srand48mainで一度だけ実行します。randsrandの関係と同じです。

投稿2021/12/15 03:48

otn

総合スコア85901

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

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

zyunnsuke

2021/12/15 04:04

srand48()は初期化?だけみたいですね。drand48()は学校の環境では対応していないみたいなので、erand48()を使ってみようと思います。ありがとうございました。
guest

0

srandなんたら、はあくまで乱数の種を設定するための関数です。
それをもとに乱数を発生させる関数は別にありますんで調べてみよう

投稿2021/12/15 04:05

y_waiwai

総合スコア88040

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

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

zyunnsuke

2021/12/15 16:58

drand48()やerand48()がそれにあたるようですね。アドバイスありがとうございます。
guest

0

試行ごとに異なる結果を得るために、乱数の種を用いようと考えているのですが、

まず,「乱数の種」の話を扱わない,「常に同一の結果を得るプログラム」を完成させましょう.
(この出発点が無い状態において「試行ごとに異なるように…」という次のステップのことを考えていても仕方ないので.)

で,それができたら

乱数の種をtime関数を用いて取得し、srand(time_t)のような形main文で指定して…

という要素をちょろっと追加するだけです.
main関数の先頭ら辺に srand (なのか srand48 の方なのか知らんけども)を使う数行を書けば完成するでしょう.

投稿2021/12/15 04:00

fana

総合スコア11996

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

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

fana

2021/12/15 04:05

srand は標準関数だが, srand48 というやつはそうじゃないと思う. まずは,どっちを使う話なのか? というあたりを確定させる必要がありそう. ↓ > 「常に同一の結果を得るプログラム」 が完成したならば,その時点で,疑似乱数のために何という関数を用いるのかが定まっているハズなので, そしたら,その疑似乱数を使う手段用の「乱数の種」の話を書けばよかろう,と.
zyunnsuke

2021/12/15 04:06

そうですね、まずは段階を踏んでやっていこうと思います。 ありがとうございます。
guest

0

基礎からやった方がいいのでは

ここによると、srand48関数はシードを使った初期化用です。

戻り値はvoidなのでloc[i].x = とかで受け取ません。

投稿2021/12/15 03:46

BeatStar

総合スコア4962

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

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

zyunnsuke

2021/12/15 04:03

なるほど、、この記事とてもわかりやすいですね。 以前教授がdrand48()は学校での環境(windows)では対応していないといっていたので、erand48()を使ってみようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問