FC2ブログ

D 言語学習:ファイルアクセス、乱数

2019-06-19 :  PCクリニック
前回(2019-06-12)の記事:
D 言語ってどうかナ?」で導入し、
触ってみた “DMDコンパイラでは、最適化するとほぼC 言語に匹敵する” 様だ。


そこで、
絶対必要と思うファイルアクセス乱数処理を学習した。


学習教材は、前回記事で書いた「Downloads - D Programming Language
のドキュメントの日本語翻訳版:
Home - プログラミング言語 D (日本語訳)
を頂いた。


ファイル・入出力4通り(バイナリ/テキスト の、出力/入力)他・・・
一通りのコード:
// std.file - DIGITAL MARS  D_Lang 2.0  -------  std_file.d

/* ------------------------------------------------------*/
/* バイナリファイル出力 */

// void write( in char[] name, const void[] buffer );

void main(){ import std.file;
int[] a = [ 0, 1, 1, 2, 3, 5, 8 ];
write( "File_int32.bin", a ); // 7*4Byte=28Byte

/* ------------------------------------------------------*/
/* バイナリファイル入力 */

// void[] read(in char[] name, size_t upTo = uint.max);

import std.stdio;
int[] b;
auto ww = read( "File_int32.bin", 12 ); // 12/4=int[3]
auto IT = cast(int[])ww;
writeln( IT[1], " , ", IT[2] ); // ゼロオリジン: 1 , 1

/* ------------------------------------------------------*/
/* キーボード入力 */

// S readln( S = string )( dchar terminator = '\x0a' );

char[] buf;
stdin.readln( buf ); //char[]型の入力 // std.io

/* ------------------------------------------------------*/
/* ファイル削除 */

// void remove( in char[] name );

std.file.remove( "File_int32.bin" );

/* ------------------------------------------------------*/
/* テキストファイル出力 */

import std.string; // std.file

string s = "Text abc";
auto OT = File( "test.txt", "w" ); // writeオープン
OT.write( s ~ "\n" );

/* ------------------------------------------------------*/
/* テキストファイル入力 */

import std.conv;

auto w = File( "test2.txt" ).readln; // std.file -- 事前作成済
writeln( "RRR" ~ w, w.length ); // std.io -- 10Byte

}
こんな感じ?


次に、数学関数と乱数生成処理:
//                                      -------  std_math_sp_rnd.d
// std.math - DIGITAL MARS D_Lang 2.0
/*
  初等的な数学関数です。

 初等的な数学関数 (冪乗、平方根、三角関数など) と、
 低水準の浮動小数点演算を提供するモジュールです。
 数学的特殊関数は std.mathspecial に実装されています。

 それぞれの機能は、浮動小数点演算の標準規格 IEEE754-2008 に
 比較的忠実に実装されています。
 関数名に関しても、C99式の小文字の名前ではなく、
 camelCase 形式の名前となっています。
 全ての関数は、無限大やNANを与えたときも規格通りに動作します。

 C言語と違い、グローバルな 'errno' 変数はありません。
 従って、これらの関数のほとんどは pure nothrow です。

 Status:
 Γ関数とエラー関数は、改善され std.mathspecial に移動されました。
  std.math では DMD2.055 から公式に非推奨となります。
  feqrel と approxEqual の名前と意味論は改訂される予定です。
*/

/* -----------------------------------------------------------*/
import std.stdio; // writeln

void main(){ import M = std.math;

writeln( "E= ", M.E ); // 2.71828
writeln( "pi= ", M.PI ); // 3.14159

/* ------------------------------------------------------*/
// pure nothrow @safe real sin(real x);

double a = 45.0 /180.0*M.PI;
writeln( "sin(45)= ", M.sin(a) ); // 0.707107

/* -----------------------------------------------------------*/
import MS = std.mathspecial;

// std.mathspecial - DIGITAL MARS D_Lang 2.0
/*
  数学の特殊関数を定義したモジュールです。

 '特殊関数 (Special Functions)' というテクニカルタームには、
 いくつかの種類の超越関数が含まれ、
 数学や物理学の特定領域において重要な応用があります。

 ガンマ関数や関連する関数と、誤差関数は 統計において必須の関数です。
 Bessel関数やその関連は、
  (特に光学において) 波動の伝搬に関連する問題で使われます。
 その他に特殊関数として有名なものは、
 楕円積分(楕円の弧の長さに関係があります)や、
 超幾何関数などがあります。
*/

// real gamma(real x);

double b = 0.5;
writeln( "gamma(1/2)= ", MS.gamma(b) ); // 1.77245

/* -----------------------------------------------------------*/
import R = std.random;

// std.random - DIGITAL MARS D_Lang 2.0
/*
 乱数生成の機能を実装しています。
 旧形式の関数 rand_seed と rand は、グローバル状態を使っていてスレッド
 安全性など様々な問題を引き起こすため、すぐに非推奨となる予定です。

 新形式の乱数生成器はそれぞれ自身の状態を保持したオブジェクト
 となっているため、スレッドの問題とは無縁です。
 乱数生成器は、 よく知られた様々な乱数生成方式によって実装されています。
 全体的に高速で信頼性の高い乱数生成法は
 "周期 2^19937 の Mersenne Twister"から 名前をとった Mt19937 です。
 メモリの制約のきつい状況では、 線形合同法 による生成器 MinstdRand0 や
 MinstdRand が有用でしょう。
 標準ライブラリでは、alias Random を、ターゲット環境に
 もっとも合っていると思われる生成器の別名として提供しています。
*/

/*
// 範囲 [0, 14] に一様に分布する整数を生成
auto i = uniform(0, 15);
*/

/*
// 範囲 [0, 100) に一様に分布する実数を
// 指定の乱数ジェネレータを使って生成
Random gen;
auto r = uniform(0.0L, 100.0L, gen);
*/

// -------------------------------------------------
/* alias Mt19937;
MersenneTwisterEngine を、
オリジナルの実装 MT19937 と同じパラメタでインスタンス化したもの。
一様分布した32bitの数値を、2の19937乗の周期で生成します。
メモリが著しく制限されている場合でない限り
(その場合は LinearCongruentialEngine を選択すべきでしょう)、
お勧めの乱数生成エンジンです。
*/

// 定数でシードを与える
R.Mt19937 gen;
auto n = gen.front; // 実行によらず同じ値

for( int k=0; k<5; k++ ){
auto r = R.uniform( 0.0f, 1.0f, gen ); // 区間 [0, 1) 内のfloatを生成
writeln( r );
}

writeln( ' ' ); // ------------------

// 予測不能値にシードを設定
gen.seed( R.unpredictableSeed );
n = gen.front; // 実行するたびに違う値

for( int k=0; k<5; k++ ){
auto r = R.uniform( 0.0f, 1.0f, gen ); // 区間 [0, 1) 内のfloatを生成
writeln( r );
}

/* 参考サイト「D言語の乱数生成」 */

}
と行った処。



本日はここまで。


D ( DMD ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190412
関連記事
スポンサーサイト



コメントの投稿

管理者にだけ表示を許可する

人気blog Ranking



最新記事
カレンダー
06 | 2021/07 | 08
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

FC2 / i2i / Google




Google Analytics
ブックマーク