`BN_rand`

,

`BN_pseudo_rand`

,

`BN_rand_range`

,

`BN_pseudo_rand_range`

—

generate pseudo-random number

```
#include
<openssl/bn.h>
```

`int`
`BN_rand`

(

`BIGNUM
*rnd`,

`int bits`,

`int top`,

`int
bottom`);

`int`
`BN_pseudo_rand`

(

`BIGNUM
*rnd`,

`int bits`,

`int top`,

`int
bottom`);

`int`
`BN_rand_range`

(

`BIGNUM
*rnd`,

`BIGNUM *range`);

`int`
`BN_pseudo_rand_range`

(

`BIGNUM
*rnd`,

`BIGNUM *range`);

`BN_rand`

() generates a cryptographically
strong pseudo-random number of

`bits` in length
and stores it in

`rnd`. If

`top` is -1, the most significant bit of the
random number can be zero. If

`top` is 0, it is
set to 1, and if

`top` is 1, the two most
significant bits of the number will be set to 1, so that the product of two
such random numbers will always have 2*

`bits`
length. If

`bottom` is true, the number will be
odd. The value of

`bits` must be zero or
greater. If

`bits` is +1 then

`top` cannot also be 1.

`BN_pseudo_rand`

() does the same, but
pseudo-random numbers generated by this function are not necessarily
unpredictable. They can be used for non-cryptographic purposes and for certain
purposes in cryptographic protocols, but usually not for key generation etc.

`BN_rand_range`

() generates a cryptographically
strong pseudo-random number

`rnd` in the range
0 <=

`rnd` <
`range`.

`BN_pseudo_rand_range`

() does the same, but
is based on

`BN_pseudo_rand`

(), and hence
numbers generated by it are not necessarily unpredictable.

The functions return 1 on success, 0 on error. The error codes can be obtained
by

ERR_get_error(3).

BN_new(3),

ERR_get_error(3),

RAND_add(3),

RAND_bytes(3)
`BN_rand`

() first appeared in SSLeay 0.5.1 and
has been available since

OpenBSD 2.4.

`BN_pseudo_rand`

() first appeared in OpenSSL
0.9.5 and has been available since

OpenBSD 2.7.

The

`top` == -1 case and the function

`BN_rand_range`

() first appeared in OpenSSL
0.9.6a and have been available since

OpenBSD 3.0.

`BN_pseudo_rand_range`

() first appeared in
OpenSSL 0.9.6c and have been available since

OpenBSD
3.2.