fortran77で乱数を発生させる方法

このQ&Aのポイント
  • fortran77で乱数を発生させる方法について教えてください。
  • fortran90では乱数の組み込み関数がありますが、fortran77ではどのように乱数を発生させればよいのでしょうか?
  • salford FTN77で乱数を発生させる方法を教えてください。
回答を見る
  • ベストアンサー

fortran77で乱数を発生させたい

fortran77で乱数を発生させたい こんばんわ。fortran77で乱数を発生させるにはどうすればいいのでしょうか? 調べてみるとfortran90ならば乱数の組み込み関数が用意されているようなのですが、fortran70にはないそうです。   real function random(i)    i=843314861*i+453816693    random=real(i)/2**31   end function   do 10 k=1,n    ransu(k)=random(i) 10 continue これを用いることで乱数が発生できると書いてあったのですが、オーバーフローしてしまったせいか、値がマイナスのものが出てきてしまい、うまくできませんでした。 これ以外にも方法はないでしょうか? 私の環境はsalford FTN77です。 回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

C言語での説明になっていますが、Fortranにも移植可能だと思われます http://www001.upp.so-net.ne.jp/isaku/rand.html あとは、整数の型を工夫して、bit数を多く取るとか

thjki6624
質問者

お礼

ありがとうございました。 サイト参考にさせていただきました。そのおかげもあり、どうにかできました。

関連するQ&A

  • FORTRAN 複素数 (実部を取り出す方法)

    fortran77で複素数の実部を取り出したいのですが、 関数が存在するかわかりません。どなたか、ご存知の方、 教えてください。虚部は出せました。 FORTRAN77(SALFORD FTN77)を使っています。 確か、fortran90なら real(○+□i)だったと思います。

  • パスカル言語を用いた乱数利用について

    パスカル言語を用いた乱数発生についての質問です。 パスカル言語を用いて0~100までの整数をランダムで10個出したいので、次のようにプログラムを組んだのですが、 欲しい乱数が出てきません。どこが間違えているか指摘していただけないでしょうか。よろしくお願いします。 var x : integer; p : real; {本当はintegerなのだろうが、使うよう指示されたrandom関数を使うとなるとrealしか受け付けなかった。} begin i := 0; x := seed(wallclock); while i <> 10 do begin i := i + 1; p := random(100); writeln('random(100)=',p) end end. ちなみに、これを出力した時の例はこのような感じです。 random(100)=6.8e-01 random(100)=6.4e-02 random(100)=9.3e-01 random(100)=1.3e-01 random(100)=7.2e-01 random(100)=8.8e-01 random(100)=9.1e-02 random(100)=9.5e-01 random(100)=3.6e-01 random(100)=7.9e-01 (※6.8e-01とは6.8*10^(-1)をのことです)

  • 乱数を発生させて、それを配列して小さい順に並べる

    乱数の発生のさせ方は、質問集で見て import java.util.Random; class ransuu { public static void main(String args[]) { Random rand = new Random(); for ( int i = 0; i <10; i++){ int x = rand.nextInt(9); System.out.println(x); } } } を用いて表示できたのですが、そのあとの配列がよく分かりませんのでぜひ教えてください。ちなみに私の持っているテキストには任意の数(22、80、57、60、50など)を並べ替えるというものはあるのですが、今回のような乱数+配列の例が載っていないのでよく分かりませんでした。

    • ベストアンサー
    • Java
  • 乱数について

    MathクラスのRandomメソッドを使用して、hairetu[i] = (int)(Math.random() * 100);のように乱数を取得しているのですが、このMath.randomについても、平均を取ると大体、真ん中の50になる等の特徴があるかもしれません。一様乱数と標準正規乱数が関係するのでしょうか?この2つの違いについて教えてください(^^;

    • ベストアンサー
    • Java
  • FORTRAN→Cに翻訳

     どなたか、次のFORTRANのプログラムを、Cに、翻訳して頂けないでしょうか。C++ではなく、Cです。ANSI準拠のCでお願いします。  プログラムの内容は、最小二乗法による計算プログラムです。MS-DOS Ver3.3~6.0の頃の、MS FORTRANコンパイラ仕様のものです。その頃持っていたFORTRANの本も処分してしまい、今からFORTRANを学びなおすのにも多大な労力と時間がかかりそうなので、Cに翻訳して頂ければ大変ありがたいです。よろしくお願いします。 (“□”はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ C□LEAST SQUARE APPROXIMATION □PROGRAM MAIN9 □DIMENSION X(100),Y(100),S(0:18),T(0:9),SM(10,10),TV(10),AV(10) □WRITE(*,*) 'N ?' □READ(*,*) N □WRITE(*,*) 'x1,x2,..,xn ?' □READ(*,*) ( X(I),I=1,N ) □WRITE(*,*) 'y1,y2,..,yn ?' □READ(*,*) ( Y(I),I=1,N ) □WRITE(*,*) 'M ?' □READ(*,*) M □DO 110 K=0,M*2 □□VS=0. □□DO 100 I=1,N □100□VS=VS+X(I)**K □□S(K)=VS □110□CONTINUE □□DO 130 K=0,M □□□VS=0. □□□DO 120 I=1,N □120□VS=VS+Y(I)*X(I)**K □□□T(K)=VS □130 CONTINUE □□DO 140 I=1,M+1 □□□DO 140 J=1,M+1 □□□□K=I+J-2 □□□□SM(I,J)=S(K) □140 CONTINUE □□DO 150 I=1,M+1 □150 TV(I)=T(I-1) □□CALL SIMULE( AV, SM, TV, M+1 ) □□DO 160 I=1,M+1 □160 WRITE(*,1000) I-1,AV(I) □1000 FORMAT(1H ,'A',I1,'=',F10.5) □□STOP □□END ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  • 質問(Fortran)について

    おはようございます。 下記のFortranでここから~ここまでと---で囲んでいる 部分の意味が分かりません。 乱数Pを発生させてPがEE以下になったら、140へ行けとあるのですが。。 それと(1)の部分をCに書き換えるとどうなるか、知っている方教えてください。 よろしくお願いいたします。 C *---------------------------------------------------------* C サブルーチンWGEN C *---------------------------------------------------------* SUBROUTINE WGEN(EM,R,NN,IR,ACC,ND,DT,AMAX,VMAX,MXCYCL,ERR,UW1, * UW2) C implicit real*8(a-h,o-z) COMPLEX*16 C(4096) DIMENSION ACC(ND),UW1(ND),UW2(ND) DIMENSION E(33),X(33),EE(33) DIMENSION PDIF(2046),PHI(2049),F(2049),T(2049),SV(2049),H(1), * RES(2049,1),RR(2049) PARAMETER (PI2=6.283185) DATA DX/0.03125/,H0/0./,H/0.05/,IR/101/ C C ------------------- ここから ------------------- DO 150 K=1,NN2-2 P=RAND2(IR) ← (1) C DO 130 J=2,33 IF(P.LE.EE(J)) GO TO 140 C 130 CONTINUE C 140 PDIF(K)=-(X(J-1)+(P-EE(J-1))/(EE(J)-EE(J-1))*DX)*PI2 C 150 CONTINUE C ------------------- ここまで ------------------- C *---------------------------------------------------------* C ファンクションRAND01 C *---------------------------------------------------------* REAL*8 FUNCTION RAND2(I) C INTEGER*4 L,C,T30 REAL MU PARAMETER(L=843314861,C=453816693,T30=2**30,MU=2.0**31) C I=L*I+C IF(I.LT.0) I=(I+T30)+T30 RAND2=REAL(I)/MU END C

  • 乱数のライブラリについて

    PHP5.2.4を使用しています。 小数を含む乱数を取得したい思ったのですが、そういう関数が見当たらなかったので いっそのこと、そういう機能が集まったライブラリのようなものを作ろうと思いました。 そこでフォルダの構造やクラスの分け方、メンバなどのアドバイスをして頂きたいのですが、 自分としては次のような構成を考えていて ┬ Libraryフォルダ │├Randomフォルダ ││├Abstract.php(各クラスで共通の処理) ││├Integer.php(整数の乱数、分ける目的とはいえ必要かなぁ・・・) ││├Decimal.php(小数の乱数) ││└NormalDistribution.php(正規分布の乱数) └Random.php(このファイルには何のクラスを書けばいいのか・・・そもそもこのファイルは必要?) [Integer.php] class Library_Random_Integer extends Library_Random_abstract { public function __construct($seed = false) { if ($seed !== false) { $this->setSeed($seed) } } public function Next($min, $max) { return rand($min, $max); } } [Decimal.php] class Library_Random_Decimal extends Library_Random_abstract { protected $_decimalPlace; // 最大、小数8位まで public function __construct($decimalPlace = 0, $seed = false) // これだと統一感ないなぁ・・・ { if ($seed !== false) { $this->setSeed($seed) } $this->setDecimalPlace($decimalPlace); } public function setDecimalPlace($decimalPlace) { $decimalPlace = ($decimalPlace > 8) ? 8 : $decimalPlace; $this->_decimalPlace = $decimalPlace; return $this; } public function next($min, $max) { $pow = pow(10, $this->_decimalPlace); $min *= $pow; $max *= $pow; $r = rand($min, $max); return $r / $pow; } } [NormalDistribution.php] class Library_Random_NormalDistribution extends Library_Random_abstract { public function __construct($seed = false) { if ($seed !== false) { $this->setSeed($seed) } } public function next($mu, $sigma) { $r = new DecimalRandmizer(8); $alpha = $r->Next(0, 1); $beta = $r->Next(0, 1) * pi() * 2; $boxMuller1 = sqrt(-2 * log($alpha)); $boxMuller2 = sin($beta); return $sigma * ($boxMuller1 * $boxMuller2) + $mu; } } 使用例 $r = new Library_Random_NormalDistribution(time()); print $r->next(10, 5); .NETのSystem.RandomのNextDouble()メンバのように いちいちクラス分けしなくてもこの例ならNextNormalDistribution()のように 一つのクラスに追加していく形でもいいのかもしれませんが限界がありそうなので こういう構造にしたのですが、自分ならこうするとかここがおかしいとか何でもいいのでアドバイスを頂けないでしょうか?

    • ベストアンサー
    • PHP
  • FORTRANコンパイル時について

    土木の設計でFORTRANで書かれたプログラムを使用しているのですが,コンパイルする際に下記内容のエラー(?)が出ていますが,コンパイル自体は完了しています。 これって何かオカシイのでしょうか。 ■C:\Documents and Settings\ETP5\デスクトップ\programs_2D> ftn77 /link elastc.f [Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998] Licensed to: FTN77 Personal Edition Department: Non-commercial use only 0130) END COMMENT - STXY has not been used COMMENT - SSIY has not been used COMMENT - SSIX has not been used NO ERRORS,3 COMMENTS [<ELASTC2D>FTN77 Ver 4.03] NO ERRORS [<DATA_IN>FTN77 Ver 4.03] NO ERRORS [<FIX>FTN77 Ver 4.03] NO ERRORS [<INIT>FTN77 Ver 4.03] NO ERRORS [<CALC_SIG>FTN77 Ver 4.03] 0391) IF((TK(K,I-K+1).EQ.0.D0).OR.(X(K).EQ.0.D0)) GOTO 2 WARNING - The use of .EQ. or .NE. with non-integer operands can produce misleading results WARNING - The use of .EQ. or .NE. with non-integer operands can produce misleading results NO ERRORS,2 WARNINGS [<LEQ>FTN77 Ver 4.03] NO ERRORS [<LEQ1>FTN77 Ver 4.03] NO ERRORS [<MAKE_GAMX>FTN77 Ver 4.03] NO ERRORS [<CALC_TF>FTN77 Ver 4.03] NO ERRORS [<MAKE_TK>FTN77 Ver 4.03] NO ERRORS [<WRITE_SUB>FTN77 Ver 4.03] Creating executable: elastc.exe 宜しくお願い致します。

  • fortran 乱数を用いてcosθをベクトリから求めるプログラム

    乱数を配列に格納してcosθをベクトルから求めるプログラムを書いてみたのですが、コンパイルしてみるとrandom_numberのところの設定がおかしいみたいでうまくコンパイルできません。どこに問題があるのかわからないので困っています。教えて下さい。よろしくお願いします。 module subprogs implicit none contains function vec_cos(a,b) result(vcos) real(8), intent(in) :: a(:), b(:) real(8) ab, vcos if (size(a) /= size(b)) stop ' sr : size(a) /= size(b) ' ab = dot_product(a,a) * dot_product(b,b) if (ab == 0.0d0) then vcos = 0.0d0 else vcos = dot_product(a,b)/sqrt(ab) endif end function vec_cos end module subprogs program main use subprogs implicit none real(8), allocatable :: x(:), y(:) integer n write(*,'(a)', advance = 'no') ' input n : ' read(*,*) n if ( n < 1 .or. n > 100 )stop ' n must be 0 < n < 101 ' allocate(x(n),y(n)) call random_seed call random_number(x,y) write(*,*) 'cos = ', vec_cos(x,y) end program main コンパイル結果 Undefined symbols: "_random_number__", referenced from: _MAIN_ in ccxYbc0C.o ld: symbol(s) not found

  • 1つの変数と2つの乱数を比較する

    Flash Lite1.1で三択クイズの勉強をしています。 3つの選択肢のうち、1つは答え、あとの2つはランダムで表示させたい のですが、スクリプトを書いていて疑問が出てきました。 例えば、変数kotaeが現在の答え、r1、r2が残りの選択肢とすると r1=random(10)+1; r2=random(10)+1; if(r1 == kotae || r2 == kotae || r1 == r2){ r1=random(10)+1; r2=random(10)+1;} とするとr1、r2が同じ数字になってしまう可能性が出てきます。 r1、r2が「現在の答えではなく、且つr1とr2は等しくならない」 乱数の発生というのは、どのようなスクリプトになるのでしょうか? お詳しい方、どうぞご教授願えればと存じます。

専門家に質問してみよう