|
- #!/bin/sh -
-
- # Run time: O(number of lines)
- # Memory: O(longest line)
-
- # srand seed:
- # "dd if=/dev/random 2>/dev/null | LC_ALL=C tr -d -c 1-9 | dd bs=1 count=19 2>/dev/null" | getline seed; srand(seed)
- # + rand()
-
- LC_ALL=C awk '
- function urandom(n) {
- # return random [0, n)
-
- # maxn needs to be 2**(x*4), and cbs=x
- maxn = 4294967296
-
- if (n == 1)
- return 0
-
- if (n > maxn) {
- printf("n too large!\n") > "/dev/stderr"
- exit(5)
- }
-
- for (;;) {
- "dd if=/dev/random | LC_ALL=C tr -c -d 0-9a-f | dd conv=unblock cbs=8" | getline a
-
- r = ("0x" a) + 0
- quot = int(maxn / n) * n
- if (r >= quot)
- continue
-
- return r % n
- }
- }
-
- {
- #"jot -r 1 0 " (NR - 1) | getline a
- a = urandom(NR)
- #a = int(rand() * (NR))
- if (a == 0)
- save = $0
- }
- END { print save }'
|