オフィスアワーがそろそろ始まるよ!()

rand

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をランダムにシャッフルします。

定数時間

下の関数は、それぞれ上で紹介した関数の、定数時間バージョンです。入力に依存せず、計算時間が一定です。

  • uintAtMostBiased(r: Random, comptime T: type, at_most: T) T
  • intRangeAtMostBiased(r: Random, comptime T: type, at_least: T, at_most: T) T
  • uintLessThanBiased(r: Random, comptime T: type, less_than: T) T
  • intRangeLessThanBiased(r: Random, comptime T: type, at_least: T, less_than: T) T

乱数エンジン

以下で紹介する乱数エンジンは、初期化用シードからエンジンのインスタンスを生成するinit関数と、Randomインタフェースを実装するfillメソッドを備えています。

  • init(seed: u64) Engine: 乱数エンジンのインスタンスを生成します。 Engineは、PcgXoroshiro128Isaac64Sfc64のいずれかです。

  • fill(buf: []mut u8) void: bufを生成した乱数で埋めます。

  • 疑似乱数エンジン

    • Pcg
    • Xoroshiro128
  • 暗号論的にセキュアな疑似乱数エンジン

    • Isaac64
    • Sfc64
  • エイリアス

    • DefaultPrng: Xoroshiro128
    • DefaultCsprng: Isaac64

Chapter 1

Chapter 2

Chapter 3

Chapter 4

Chapter 5

Chapter 6

Chapter 7

Chapter 8

Chapter 9

Chapter 10

Chapter 11

Chapter 12

Chapter 13

Chapter 14

Chapter 15

Appendix

Error Explanation

☰ 人の生きた証は永遠に残るよう ☰
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.