diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libc/stdlib/rand48.3 | 110 | 
1 files changed, 83 insertions, 27 deletions
| diff --git a/src/lib/libc/stdlib/rand48.3 b/src/lib/libc/stdlib/rand48.3 index a4473185de..dce8c0dd18 100644 --- a/src/lib/libc/stdlib/rand48.3 +++ b/src/lib/libc/stdlib/rand48.3 | |||
| @@ -9,9 +9,9 @@ | |||
| 9 | .\" of any kind. I shall in no event be liable for anything that happens | 9 | .\" of any kind. I shall in no event be liable for anything that happens | 
| 10 | .\" to anyone/anything when using this software. | 10 | .\" to anyone/anything when using this software. | 
| 11 | .\" | 11 | .\" | 
| 12 | .\" $OpenBSD: rand48.3,v 1.16 2014/11/25 17:26:34 millert Exp $ | 12 | .\" $OpenBSD: rand48.3,v 1.17 2014/12/08 21:45:20 deraadt Exp $ | 
| 13 | .\" | 13 | .\" | 
| 14 | .Dd $Mdocdate: November 25 2014 $ | 14 | .Dd $Mdocdate: December 8 2014 $ | 
| 15 | .Dt RAND48 3 | 15 | .Dt RAND48 3 | 
| 16 | .Os | 16 | .Os | 
| 17 | .Sh NAME | 17 | .Sh NAME | 
| @@ -22,8 +22,11 @@ | |||
| 22 | .Nm mrand48 , | 22 | .Nm mrand48 , | 
| 23 | .Nm jrand48 , | 23 | .Nm jrand48 , | 
| 24 | .Nm srand48 , | 24 | .Nm srand48 , | 
| 25 | .Nm srand48_deterministic , | ||
| 25 | .Nm seed48 , | 26 | .Nm seed48 , | 
| 27 | .Nm seed48_deterministic , | ||
| 26 | .Nm lcong48 | 28 | .Nm lcong48 | 
| 29 | .Nm lcong48_deterministic | ||
| 27 | .Nd pseudo-random number generators and initialization routines | 30 | .Nd pseudo-random number generators and initialization routines | 
| 28 | .Sh SYNOPSIS | 31 | .Sh SYNOPSIS | 
| 29 | .In stdlib.h | 32 | .In stdlib.h | 
| @@ -41,31 +44,56 @@ | |||
| 41 | .Fn jrand48 "unsigned short xseed[3]" | 44 | .Fn jrand48 "unsigned short xseed[3]" | 
| 42 | .Ft void | 45 | .Ft void | 
| 43 | .Fn srand48 "long seed" | 46 | .Fn srand48 "long seed" | 
| 47 | .Ft void | ||
| 48 | .Fn srand48_deterministic "long seed" | ||
| 44 | .Ft "unsigned short *" | 49 | .Ft "unsigned short *" | 
| 45 | .Fn seed48 "unsigned short xseed[3]" | 50 | .Fn seed48 "unsigned short xseed[3]" | 
| 51 | .Ft "unsigned short *" | ||
| 52 | .Fn seed48_deterministic "unsigned short xseed[3]" | ||
| 46 | .Ft void | 53 | .Ft void | 
| 47 | .Fn lcong48 "unsigned short p[7]" | 54 | .Fn lcong48 "unsigned short p[7]" | 
| 55 | .Ft void | ||
| 56 | .Fn lcong48_deterministic "unsigned short p[7]" | ||
| 48 | .Sh DESCRIPTION | 57 | .Sh DESCRIPTION | 
| 49 | .Bf -symbolic | 58 | .Bf -symbolic | 
| 50 | This interface is not cryptographically secure, so consider using | 59 | Standards insist that this interface return deterministic results. | 
| 51 | .Xr arc4random 3 | 60 | Unsafe usage is very common, so | 
| 52 | instead. | 61 | .Ox | 
| 62 | changed the subsystem to return non-deterministic results by default. | ||
| 53 | .Ef | 63 | .Ef | 
| 54 | .Pp | 64 | .Pp | 
| 55 | The | 65 | To satisfy portable code, | 
| 56 | .Fn rand48 | 66 | .Fn srand48 , | 
| 57 | family of functions generates pseudo-random numbers using a linear | 67 | .Fn seed48 , | 
| 58 | congruential algorithm working on integers 48 bits in size. | 68 | or | 
| 59 | The particular formula employed is | 69 | .Fn lcong48 | 
| 60 | r(n+1) = (a * r(n) + c) mod m | 70 | should be called to initialize the subsystem. | 
| 61 | where the default values are | 71 | In | 
| 62 | for the multiplicand a = 0xfdeece66d = 25214903917 and | 72 | .Ox | 
| 63 | the addend c = 0xb = 11. | 73 | the | 
| 64 | The modulus is always fixed at m = 2 ** 48. | 74 | seeding parameters are ignored, and strong random number results will be | 
| 65 | r(n) is called the seed of the random number generator. | 75 | provided from | 
| 76 | .Xr arc4random 3. | ||
| 77 | In other systems, the | ||
| 78 | parameters prime a simplistic deterministic algorithm. | ||
| 66 | .Pp | 79 | .Pp | 
| 67 | For all the six generator routines described next, the first | 80 | If the standardized behavior is required then | 
| 68 | computational step is to perform a single iteration of the algorithm. | 81 | .Fn srand48_deterministic , | 
| 82 | .Fn seed48_deterministic , | ||
| 83 | and | ||
| 84 | .Fn lcong48_deterministic | ||
| 85 | can be substituted for | ||
| 86 | .Fn srand48 , | ||
| 87 | .Fn seed48 , | ||
| 88 | and | ||
| 89 | .Fn lcong48 . | ||
| 90 | That will cause subsequent | ||
| 91 | calls to | ||
| 92 | .Fn drand48 , | ||
| 93 | .Fn lrand48 , | ||
| 94 | and | ||
| 95 | .Fn jrand48 | ||
| 96 | to return results using the deterministic algorithm. | ||
| 69 | .Pp | 97 | .Pp | 
| 70 | .Fn drand48 | 98 | .Fn drand48 | 
| 71 | and | 99 | and | 
| @@ -91,6 +119,21 @@ return values of type long in the range | |||
| 91 | [-2**31, 2**31-1]. | 119 | [-2**31, 2**31-1]. | 
| 92 | The high-order (32) bits of r(n+1) are loaded into the returned value. | 120 | The high-order (32) bits of r(n+1) are loaded into the returned value. | 
| 93 | .Pp | 121 | .Pp | 
| 122 | In the deterministic mode, the | ||
| 123 | .Fn rand48 | ||
| 124 | family of functions generates numbers using a linear congruential | ||
| 125 | algorithm working on integers 48 bits in size. | ||
| 126 | The particular formula employed is | ||
| 127 | r(n+1) = (a * r(n) + c) mod m | ||
| 128 | where the default values are | ||
| 129 | for the multiplicand a = 0xfdeece66d = 25214903917 and | ||
| 130 | the addend c = 0xb = 11. | ||
| 131 | The modulus is always fixed at m = 2 ** 48. | ||
| 132 | r(n) is called the seed of the random number generator. | ||
| 133 | .Pp | ||
| 134 | For all the six generator routines described next, the first | ||
| 135 | computational step is to perform a single iteration of the algorithm. | ||
| 136 | .Pp | ||
| 94 | .Fn drand48 , | 137 | .Fn drand48 , | 
| 95 | .Fn lrand48 , | 138 | .Fn lrand48 , | 
| 96 | and | 139 | and | 
| @@ -110,7 +153,7 @@ holds the least significant bits. | |||
| 110 | .Pp | 153 | .Pp | 
| 111 | All functions share the same multiplicand and addend. | 154 | All functions share the same multiplicand and addend. | 
| 112 | .Pp | 155 | .Pp | 
| 113 | .Fn srand48 | 156 | .Fn srand48_deterministic | 
| 114 | is used to initialize the internal buffer r(n) of | 157 | is used to initialize the internal buffer r(n) of | 
| 115 | .Fn drand48 , | 158 | .Fn drand48 , | 
| 116 | .Fn lrand48 , | 159 | .Fn lrand48 , | 
| @@ -121,7 +164,7 @@ of r(n), with the lower 16 bits of r(n) arbitrarily being set to 0x330e. | |||
| 121 | Additionally, the constant multiplicand and addend of the algorithm are | 164 | Additionally, the constant multiplicand and addend of the algorithm are | 
| 122 | reset to the default values given above. | 165 | reset to the default values given above. | 
| 123 | .Pp | 166 | .Pp | 
| 124 | .Fn seed48 | 167 | .Fn seed48_deterministic | 
| 125 | also initializes the internal buffer r(n) of | 168 | also initializes the internal buffer r(n) of | 
| 126 | .Fn drand48 , | 169 | .Fn drand48 , | 
| 127 | .Fn lrand48 , | 170 | .Fn lrand48 , | 
| @@ -131,14 +174,14 @@ but here all 48 bits of the seed can be specified in an array of 3 shorts, | |||
| 131 | where the zeroth member specifies the lowest bits. | 174 | where the zeroth member specifies the lowest bits. | 
| 132 | Again, the constant multiplicand and addend of the algorithm are | 175 | Again, the constant multiplicand and addend of the algorithm are | 
| 133 | reset to the default values given above. | 176 | reset to the default values given above. | 
| 134 | .Fn seed48 | 177 | .Fn seed48_deterministic | 
| 135 | returns a pointer to an array of 3 shorts which contains the old seed. | 178 | returns a pointer to an array of 3 shorts which contains the old seed. | 
| 136 | This array is statically allocated, so its contents are lost after | 179 | This array is statically allocated, so its contents are lost after | 
| 137 | each new call to | 180 | each new call to | 
| 138 | .Fn seed48 . | 181 | .Fn seed48_deterministic . | 
| 139 | .Pp | 182 | .Pp | 
| 140 | Finally, | 183 | Finally, | 
| 141 | .Fn lcong48 | 184 | .Fn lcong48_deterministic | 
| 142 | allows full control over the multiplicand and addend used in | 185 | allows full control over the multiplicand and addend used in | 
| 143 | .Fn drand48 , | 186 | .Fn drand48 , | 
| 144 | .Fn erand48 , | 187 | .Fn erand48 , | 
| @@ -169,14 +212,27 @@ The | |||
| 169 | .Fn drand48 , | 212 | .Fn drand48 , | 
| 170 | .Fn erand48 , | 213 | .Fn erand48 , | 
| 171 | .Fn jrand48 , | 214 | .Fn jrand48 , | 
| 172 | .Fn lcong48 , | ||
| 173 | .Fn lrand48 , | 215 | .Fn lrand48 , | 
| 174 | .Fn mrand48 , | 216 | .Fn mrand48 , | 
| 175 | .Fn nrand48 , | ||
| 176 | .Fn seed48 , | ||
| 177 | and | 217 | and | 
| 178 | .Fn srand48 | 218 | .Fn nrand48 , | 
| 179 | functions conform to | 219 | functions conform to | 
| 180 | .St -p1003.1-2008 . | 220 | .St -p1003.1-2008 . | 
| 221 | .Pp | ||
| 222 | The | ||
| 223 | .Fn seed48 , | ||
| 224 | .Fn srand48 , | ||
| 225 | and | ||
| 226 | .Fn lcong48 | ||
| 227 | function do not conform to | ||
| 228 | .St -ansiC , | ||
| 229 | intentionally. | ||
| 230 | .Pp | ||
| 231 | The | ||
| 232 | .Fn seed48_deterministic , | ||
| 233 | .Fn srand48_deterministic , | ||
| 234 | and | ||
| 235 | .Fn lcong48_deterministic | ||
| 236 | functions are OpenBSD extensions. | ||
| 181 | .Sh AUTHORS | 237 | .Sh AUTHORS | 
| 182 | .An Martin Birgmeier | 238 | .An Martin Birgmeier | 
