標準ライブラリはじめにけっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。リクエストあれば、優先する、かも?乱数について続きを見ていきましょう。前回は、Randomインタフェースと、それを実装する乱数生成器について、簡単な説明をしました。今回は、Randomインタフェースの使い方です。std.rand.bytesbufで渡されたスライスをランダムなバイトで埋めます。rはRandomインタフェースを実装する乱数生成器を渡します。これは、Randomインタフェースのfillを直接呼び出すのと同じです。.{buf});}std.rand.booleanランダムなブール値を取得します。boolstd.rand.intランダムなT型の整数値を取得します。指定範囲の整数値を取得する関数など、色々あります。一覧は公式ドキュメントをどうぞ。標準ライブラリはじめにけっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。リクエストあれば、優先する、かも?乱数について見ていきましょう。std.rand.RandomまずはRandomインタフェースです。std.randの多くのAPIは、Randomインタフェースを実装する構造体インスタンスを必要とします。Randomインタフェースは、ランダムな値でスライスを埋めるfill()関数を実装しなければなりません。void;};このRandomインタフェースを実装する構造体として、std.randには次の乱数生成器があります。Xoroshiro128Isaac64Sfc64例えば、Xoroshiro128を直接使うのであれば、次のようにinit()で初期化した後、fill()で乱数を取得します。.{buf});}実行結果は次の通りです。0xa333d71ca4469950fa4b疑似乱数なので、この使い方だと毎回同じ値が出力されます。標準ライブラリはじめにけっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。リクエストあれば、優先する、かも?グローバルなデータをスレッド安全に初期化するLazyInitです。std.lazy.LazyInitコンパイル時に初期値が決まらないグローバルデータを、安全に初期化するのは意外と面倒です。LazyInitはそのような場合に、安全にグローバルデータを初期化することができます。任意の型Tに対して、LazyInit(T)の値を返します。この時、T型の値は未定義です。LazyInit(T)LazyInitはget()とresolve()の2つのメソッドを持ちます。内部は簡単なステートマシンを持っており、resolve()を呼ぶと、初期化済み状態になります。}}注意点としては、get()でnullが返ってきたら、必ず初期化しないといけない、ということです。次のコードは無限ループに陥ります。{}}個人的には、lazy.init()が初期化関数を受け取れるようになっていて、最初に呼ばれたget()内で初期化関数呼び出してくれる方が良いなぁ、と思ったりします。標準ライブラリはじめにけっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。リクエストあれば、優先する、かも?ソート関係ですが、ソート本体以外にstd.sortにあるものを紹介します。計算する関数ポインタを返します。コメントにあるように、sort()関数呼び出し時に引数渡しする比較関数を生成するために使います。impl.inner;}現状では、構造体の型を渡すとコンパイルエラーになります。次はコンパイルエラーです。~後で修正リクエスト投げてみましょう。std.sort.descascの逆版です。計算する関数ポインタを返します。std.sort.argMin任意型のスライスの中で最も小さい値を返します。スライスの要素数が0の場合のみ、nullを返します。?T最も小さい値が格納されているインデックスを返します。?usize使い方は、次のような感じです。std.sort.argMaxminのmax版です。std.sort.isSorted与えたスライスがソート済みかどうかをブール値で返します。標準ライブラリはじめにけっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。リクエストあれば、優先する、かも?ソート関係です。次の3つの関数を紹介します。ソート済みであることが前提ではありますが。std.sort.binarySearchソート済みのスライスitemから、keyの値を検索します。値の比較はcompareFnで与える比較関数を使用します。見つかればスライスのインデックスが、見つからない場合nullが返ります。?usizemath.Orderは次のEnumです。==演算子をサポートする型に対しては、math.orderがジェネリック関数になっており、共通して使用できます。binarySearchの使用方法は次の通りです。);}std.sort.insertionSort挿入ソートです。アロケータなしで動くのが嬉しいです。(constじゃだめ)。voidsort.asc(i32)はアイテムを昇順に並び替えるための比較関数です。次回やるので、そういうもんだと納得して下さい。&items);}std.sort.sortブロックソートです。アロケータなしで動くのが嬉しいです。O(n*log(n))です。voidinsertionSortと使い方は同じです。標準ライブラリはじめにけっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。リクエストあれば、優先する、かも?今日は時間関係です。std.time.std.time.sleep普通のスリープ関数です。引数は、スリープする秒数をナノ秒単位で与えます。time.second);}ナノ秒単位で真面目に指定するのは大変ですが、定数が次のように定義されているので、必要に応じて使います。7;std.time.timestamp秒単位のPOSIXタンムスタンプを取得します。});}出力は次のような感じです。タイムスタンプが1増えてますね。1582431128std.time.milliTimestampミリ秒版です。u64std.timer.Timer簡易タイマーです。イベントのハンドリングなどはできません。経過した時間を計測できます。標準ライブラリはじめにけっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。リクエストあれば、優先する、かも?どんな型でも比較できる便利な奴ら、genericを紹介します。一致しているかどうかをブール値で返します。この関数は任意の型に対して使用できますが、aとbとは同じ型でなければなりません。型パラメータが不要なので、とっても便利です。整数型だろうが、配列だろうが、構造体だろうが、型だろうが、雑に突っ込めば善きに計らってくれます。ref_s2));}ただし、最後に示しているように、ポインタの指し先の値が一致しているかどうか、までは見てくれません。bであるかどうかをブール値で返します。equalと大体同じです。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。