使用 mirage-crypto-rng 生成随机 `int`、`float` 和 `char`
任务
随机值 / 生成随机 `int`、`float` 和 `char`
使用的 Opam 包
- mirage-crypto-rng 测试版本: 0.11.3 — 使用的库: mirage-crypto-rng.unix
- cstruct 测试版本: 6.2.0 — 使用的库: cstruct
- randomconv 测试版本: 0.1.3 — 使用的库: randomconv
代码
使用熵源初始化 Mirage_crypto_rng
。
let () =
Mirage_crypto_rng_unix.initialize
(module Mirage_crypto_rng.Fortuna)
随机字节生成函数。
let generator n =
n
|> Mirage_crypto_rng.generate
|> Cstruct.to_string
生成 `int8`、`int16`、`int32` 或 `int64` 值。
let int8 () = Randomconv.int8 generator
let int16 () = Randomconv.int16 generator
let int32 () = Randomconv.int32 generator
let int64 () = Randomconv.int64 generator
生成严格小于 `bound` 的随机 `int` 或 `float` 值。
let int ?bound () =
Randomconv.int ?bound generator
let float ?bound () =
Randomconv.float ?bound generator
生成 `char` 值。
let char () = () |> int8 |> Char.chr
let digit () = 48 + int ~bound:10 () |> Char.chr
let majuscule () = 65 + int ~bound:26 () |> Char.chr
let minuscule () = 97 + int ~bound:26 () |> Char.chr
let letter () =
let n = int ~bound:52 () in
Char.chr @@ n + if n < 26 then 65 else 71
let alphanum () =
let n = int ~bound:62 () in
Char.chr @@ n
+ if n < 10 then 48 else if n < 36 then 55 else 61
将随机字节写入字节数组或大数组。
let bytes n =
n
|> Mirage_crypto_rng.generate
|> Cstruct.to_bytes
let bigarray n =
n
|> Mirage_crypto_rng.generate
|> Cstruct.to_bigarray
let list n gen = List.init n (fun _ -> gen ())