std.rand
は乱数生成に関するモジュールです。Random
インタフェースとRandom
インタフェースを使用する関数、いくつかの乱数 (疑似乱数) エンジンがあります。いくつかの乱数エンジンは、暗号論的にセキュアな疑似乱数生成器 (CSPRNG; cryptographically secure pseudo random number generator)です。
乱数エンジンもRandom
インタフェースを実装しています。乱数エンジンは外部の乱数を使って初期化します。OS上で動作するアプリケーションであればstd.crypto.randomBytes
を使うと良いでしょう。
デフォルトの乱数エンジンを使用する場合の実装例は、次の通りです。
examples/ch09-std/rand/src/rand.zen:4:14
const rand = std.rand;
const DefaultPrng = rand.DefaultPrng;
test "basic usage of rand" {
var buf: [8]u8 = undefined;
try std.crypto.randomBytes(buf[0..]);
const seed = mem.readIntNative(u64, &buf);
var r = DefaultPrng.init(seed);
const s = rand.int(&mut r, u64);
}
インタフェースRandom
が定義されています。
pub const Random = interface {
fn fill(buf: []mut u8) void;
};
インタフェースRandom
を実装する構造体は、次の関数を利用できます。
bytes(r: Random, buf: []mut u8) void
: buf
をランダムなバイト列で埋めます。均等分布します。boolean(r: Random) bool
: ランダムなブール型の値を生成します。均等分布します。int(r: Random, comptime T: type) T
: ランダムな整数型 (T
) の値を生成します。均等分布します。uintAtMost(r: Random, comptime T: type, at_most: T) T
: at_most
以下のランダムな符号なし整数型 (T
) の値を生成します。均等分布します。intRangeAtMost(r: Random, comptime T: type, at_least: T, at_most: T) T
: at_least
以上、at_most
以下のランダムな整数型 (T
) の値を生成します。均等分布します。uintLessThan(r: Random, comptime T: type, less_than: T) T
: less_than
より小さいランダムな符号なし整数型 (T
) の値を生成します。均等分布します。intRangeLessThan(r: Random, comptime T: type, at_least: T, less_than: T) T
: at_least
以上で、less_than
より小さいランダムな符号なし整数型 (T
) の値を生成します。均等分布します。float(r: Random, comptime T: type) T
: ランダムな浮動小数点型 (T
) の値を生成します。0
以上1
より小さい値が返ります。均等分布します。floatNorm(r: Random, comptime T: type) T
: ランダムな浮動小数点型 (T
) の値を生成します。正規分布に従います。floatExp(r: Random, comptime T: type) T
: ランダムな浮動小数点型 (T
) の値を生成します。指数分布に従います。shuffle(r: Random, comptime T: type, buf: []mut T) void
: buf
をランダムにシャッフルします。下の関数は、それぞれ上で紹介した関数の、定数時間バージョンです。入力に依存せず、計算時間が一定です。
以下で紹介する乱数エンジンは、初期化用シードからエンジンのインスタンスを生成するinit
関数と、Random
インタフェースを実装するfill
メソッドを備えています。
init(seed: u64) Engine
: 乱数エンジンのインスタンスを生成します。 Engine
は、Pcg
、Xoroshiro128
、Isaac64
、Sfc64
のいずれかです。
fill(buf: []mut u8) void
: buf
を生成した乱数で埋めます。
疑似乱数エンジン
暗号論的にセキュアな疑似乱数エンジン
エイリアス
☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 connectFree Corporation. All rights reserved. | 特定商取引法に基づく表示
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.