-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
{
pkgs,
}:
let
# pkgs = import <nixpkgs> { };
genSeed =
pkgs.runCommandLocal "recursive"
{
requiredSystemFeatures = [ "recursive-nix" ];
buildInputs = [ pkgs.nix ];
}
''
cat $(nix-build -E 'let pkgs = import <nixpkgs> { }; in pkgs.runCommandLocal "your random number" { } "od -A n -t d -N 4 /dev/random > $out"') > $out
'' |> builtins.readFile;
# mkGiantFile =
# pkgs.runCommand "evil evil evil" { } "${pkgs.util-linux}/bin/fallocate -l 1G $out" |> builtins.pathExists |> builtins.toString;
#
# sleep = i:
# pkgs.runCommand ("sleeeeeep" + i) { } "sleep 10 && echo > $out" |> builtins.readFile;
seed = genSeed; # + mkGiantFile + (sleep "a") +(sleep "b");
hash = builtins.hashString "sha256";
rng =
seed:
pkgs.lib.fix (self: {
int = (builtins.fromTOML "x=0x${builtins.substring 28 8 (hash seed)}").x;
intBetween = x: y: x + pkgs.lib.mod self.int (y - x);
next = rng (hash seed);
skip = pkgs.lib.flip pkgs.lib.pipe [
(pkgs.lib.flip pkgs.lib.replicate (x: x.next))
(pkgs.lib.pipe self)
];
take = builtins.genList self.skip;
});
in
(rng seed).int