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

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

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

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

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

2回答

1538閲覧

vba

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

0クリップ

投稿2016/05/27 10:37

###前提・実現したいこと
現在Visual basicのプログラムをC言語に書き換えています
そこでRandomizeの関数がでてくるのですが、これをどのように書き換えればいいのかわかりません
自分なりにプログラムを作りましたが、同じような値が出力されません
特にわからない箇所が
Randomize4の意味は毎回同じシートを使って乱数を指定しているので乱数の出方のパターンは同じということですか?
また、Rnd1とRnd2に代入される乱数は同じ値ですか?

最終的にはこの部分と同じプログラムをC言語で書きたいです
なので書き換えの部分で変な箇所があればどのように直すのか教えていただきたいです

Visual basic
以下はプログラムの途中部分です
Randomize 4
PI = 4 * Atn(1)
For i = 1 To N / 2 - 1
For j = 1 To N / 2 - 1

If i <> 0 Or j <> 0 Then kx = i / (region) ky = j / (region) K = Sqr(kx ^ 2 + ky ^ 2) Rnd1 = Rnd Rnd2 = Rnd gauss = Abs(Sqr(-2 * Log(Rnd1)) * Cos(2 * PI * Rnd2)) '**************************** 'gaussの上限,下限 (04.6.20) If gauss < 0.001 Then gauss = 0.001 ElseIf gauss > 10 Then gauss = 10 End If '**************************** Spec = ParaA1 * (K ^ (-ParaB1)) Spec2 = Spec * (gauss ^ flag) rad = Sqr(Spec2 * 0.25) If Sqr(kx ^ 2 + ky ^ 2) >= lim Then phase = PI / 2 Else phase = 2 * PI * Rnd End If A(i, j) = rad * Cos(phase) B(i, j) = rad * Sin(phase) A(N - i - 1, N - j - 1) = rad * Cos(phase) B(N - i - 1, N - j - 1) = rad * Sin(phase) A(i, N - j - 1) = rad * Cos(phase) B(i, N - j - 1) = rad * Sin(phase) A(N - i - 1, j) = rad * Cos(phase) B(N - i - 1, j) = rad * Sin(phase) End If

以下C言語の書き換えです
visual basicでRnd1,Rnd2に代入される乱数が同じとして作ってみました
srand(3);
pi=4atan(1)
rnd = (double)rand()/RAND_MAX;
for(i = 0;i <= n/2-1;i++){
for(j = 0;j <= n/2-1;j++){
kx = i/region;
ky = j/region;
k = sqrt(kx
kx + ky*ky);
gauss = fabs( sqrt(-2 * log(rnd)) * cos(2 * pi * rnd) );
/gaussの上限,下限 (04.6.20)/
if(gauss < 0.001){
gauss = 0.001;
}else{
if(gauss > 10){
gauss = 10;
}
}

if(k == 0){ spec = 1000; }else{ spec = paraa1 * pow(k,-parab1); } spec2 = spec * pow(gauss,flag); rad = sqrt(spec2 * 0.25); if(sqrt(kx*kx + ky*ky) >= lim){ phase = pi / 2; }else{ phase = 2 * pi * rnd; } a[i][j] = rad * cos(phase); b[i][j] = rad * sin(phase); a[n-i-1][n-j-1] = rad * cos(phase); b[n-i-1][n-j-1] = rad * sin(phase); a[i][n-j-1] = rad * cos(phase); b[i][n-j-1] = rad * sin(phase); a[n-i-1][j] = rad * cos(phase); b[n-i-1][j] = rad * sin(phase); }

}

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

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

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

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

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

guest

回答2

0

ベストアンサー

Randomize4の意味は毎回同じシートを使って乱数を指定しているので乱数の出方のパターンは同じということですか?

そうです。

また、Rnd1とRnd2に代入される乱数は同じ値ですか?

違います。Rndは関数なので、使う度に異なる値が返ってきます。

VBのRndは変数のように見えますが関数なので、当然C言語側もRndが書かれていた場所で乱数を取得しないといけません。

rnd()関数を用意します。

C

1double rnd(void) 2{ 3 return (double)rand()/RAND_MAX; 4}

VBのRnd関数を使っている箇所をrnd()関数に置き換えます。

C

1// gaussの計算のところ 2gauss = fabs( sqrt(-2 * log(rnd())) * cos(2 * pi * rnd()) ); 3 4// 中略 5 6// phaseの計算のところ 7phase = 2 * pi * rnd();

ループ手前のrnd = (double)rand()/RAND_MAX;は不要なので削除してください。変数宣言も削除してください。

投稿2016/05/27 11:11

編集2016/05/27 11:15
catsforepaw

総合スコア5938

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

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

退会済みユーザー

退会済みユーザー

2016/05/27 12:52

visual basicのrndの戻り値が0以上1未満になっているのですが C言語で書き換えてみたら戻り値が整数になっているようで計算ができません 乱数の戻り値を1より小さくするにはどうしたらいいですか?
catsforepaw

2016/05/27 12:55

上のrnd関数のコード例のようにやれば、0以上1未満の値が得られます。
退会済みユーザー

退会済みユーザー

2016/05/27 13:10 編集

すいません 勘違いしました 気にしないでください
catsforepaw

2016/05/27 13:15

多分そうだろうなとは思いました。ご自身のソースでもやってましたし。 気にしてませんよ。
退会済みユーザー

退会済みユーザー

2016/05/27 13:41

ありがとうございます 値を確かめるために printf("kx=%d ",kx); printf("gauss=%d ",gauss);のプログラムを追加したのですが表示されません 変数iを含んだ計算式はこの形では表示されないんですか?
catsforepaw

2016/05/27 13:48

printfの書式は変数の型に合わせないといけません。kxもgaussもおそらくdouble型だと思うのですが、「%d」だとint型を表示するためのものなので正しく表示してくれません。double型を表示する場合は「%f」か「%g」を使ってください。
退会済みユーザー

退会済みユーザー

2016/05/27 14:02

for(i = 0;i <= n/2-1;i++){ j = 0; if(i != 0){ printf("i=%d ", i); printf("region=%f ", region); kx = i / (region); ky = j / (region); k = sqrt(kx*kx + ky*ky); printf("kx=%f ", kx); printf("k=%f ", k); printf("parab1=%lf ", parab1); gauss = fabs( sqrt(-2 * log(rnd)) * cos(2 * pi * rnd) ); /*gaussの上限,下限 (04.6.20)*/ if(gauss < 0.001){ gauss = 0.001; }else{ if(gauss > 10){ gauss = 10; } } spec = 5.14 * paraa1 * pow(k,-parab1); spec2 = spec * pow(gauss,flag); rad = sqrt(spec2 * 0.25); if(sqrt(kx*kx) >= lim){ phase = pi / 2; }else{ phase = 2 * pi * rnd; } a[i][0] = rad * cos(phase); b[i][0] = rad * sin(phase); a[n-i-1][0] = rad * cos(phase); b[n-i-1][0] = rad * sin(phase); } } 上記のように%fを使っても表示されませんでした 書き方に何か問題があるのでしょうか?
catsforepaw

2016/05/27 14:15

n には 4 以上の値が入っていますか? n が3以下だと n/2-1 は0になって`if(i != 0)`の条件に合致することなくfor文が終了してしまいます。
退会済みユーザー

退会済みユーザー

2016/05/27 14:24

nには512が入るので4以上にはなります 他に何か理由がみあたりますか?
catsforepaw

2016/05/27 14:31

そうなると問題は根深いですね。`printf("i=%d ", i);`をfor文の直後に書いてみてください。そもそもfor文自体が実行されているかどうか疑わしいです。
退会済みユーザー

退会済みユーザー

2016/05/27 14:54

printf("i=%d ", i);をfor文の直後においたらなぜかkxが出ました
catsforepaw

2016/05/27 15:04

あ、よく見たらprintfに改行がないですね。`printf("i=%d\n", i);`のように、書式の最後に改行(\n)を入れてみてください。
退会済みユーザー

退会済みユーザー

2016/05/28 15:12

わかりました ありがとうございます やってみます
guest

0

擬似乱数の生成には様々なアルゴリズムがあり、同じ数列を得るためには、同じアルゴリズムと同じシード値を使わなければなりません。

「visual basic Rnd 関数」というキーワードで検索したところ、運良く、以下のページを見つけました。

ここに Rnd 関数で使われているアルゴリズムと、それを C で再現するコードが載っていました。これを参考に実装してみてください。

一応、機械翻訳されたページもありますが、日本語がいろいろと怪しいです。


Randomize4の意味は毎回同じシートを使って乱数を指定しているので乱数の出方のパターンは同じということですか?

そのようですね。

また、Rnd1とRnd2に代入される乱数は同じ値ですか?

引数なしで Rnd を呼んでいますので、違う値になると思います。

投稿2016/05/27 11:06

tatsuya6502

総合スコア2035

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

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

退会済みユーザー

退会済みユーザー

2016/05/27 12:36

回答ありがとうございます Randomizeの理解が深まりました! 紹介してくださったページをみながら書き換えてみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問