Zen言語の標準ライブラリ紹介〜rand①〜

はじめに

けっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。 まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。

リクエストあれば、優先する、かも?

乱数について見ていきましょう。

std.rand.Random

まずはRandomインタフェースです。 std.randの多くのAPIは、Randomインタフェースを実装する構造体インスタンスを必要とします。

Randomインタフェースは、ランダムな値でスライスを埋めるfill()関数を実装しなければなりません。

pub const Random = interface {
    fn fill(buf: []u8) void;
};

このRandomインタフェースを実装する構造体として、std.randには次の乱数生成器があります。

  • Xoroshiro128
  • Isaac64
  • Sfc64

例えば、Xoroshiro128を直接使うのであれば、次のようにinit()で初期化した後、fill()で乱数を取得します。

const std = @import("std");
const rand = std.rand;
const debug = std.debug;
const testing = std.testing;

test "std.rand.Xoroshiro128" {
    var x = rand.Xoroshiro128.init(0);
    var buf = [_]u8{ 0 } ** 10;

    x.fill(&buf);

    debug.warn("random value = 0x{x}\n", .{buf});
}

実行結果は次の通りです。

random value = 0xa333d71ca4469950fa4b

疑似乱数なので、この使い方だと毎回同じ値が出力されます。