- Documentation
- Reference manual
- The SWI-Prolog library
- library(aggregate): Aggregation operators on backtrackable predicates
- library(apply): Apply predicates on a list
- library(assoc): Association lists
- library(broadcast): Broadcast and receive event notifications
- library(charsio): I/O on Lists of Character Codes
- library(check): Consistency checking
- library(clpb): CLP(B): Constraint Logic Programming over Boolean Variables
- library(clpfd): CLP(FD): Constraint Logic Programming over Finite Domains
- library(clpqr): Constraint Logic Programming over Rationals and Reals
- library(csv): Process CSV (Comma-Separated Values) data
- library(debug): Print debug messages and test assertions
- library(error): Error generating support
- library(gensym): Generate unique identifiers
- library(iostream): Utilities to deal with streams
- library(lists): List Manipulation
- library(main): Provide entry point for scripts
- library(nb_set): Non-backtrackable set
- library(www_browser): Activating your Web-browser
- library(option): Option list processing
- library(optparse): command line parsing
- library(ordsets): Ordered set manipulation
- library(pairs): Operations on key-value lists
- library(persistency): Provide persistent dynamic predicates
- library(pio): Pure I/O
- library(predicate_options): Declare option-processing of predicates
- library(prolog_pack): A package manager for Prolog
- library(prolog_xref): Cross-reference data collection library
- library(quasi_quotations): Define Quasi Quotation syntax
- library(random): Random numbers
- library(readutil): Reading lines, streams and files
- library(record): Access named fields in a term
- library(registry): Manipulating the Windows registry
- library(simplex): Solve linear programming problems
- library(solution_sequences): Modify solution sequences
- library(tabling): Tabled execution (SLG)
- library(thread_pool): Resource bounded thread management
- library(ugraphs): Unweighted Graphs
- library(url): Analysing and constructing URL
- library(varnumbers): Utilities for numbered terms
- library(yall): Lambda expressions

- The SWI-Prolog library
- Packages

- Reference manual

## A.29 library(random): Random numbers

- author
- R.A. O'Keefe, V.S. Costa, L. Damas, Jan Wielemaker
- See also
- Built-in function random/1:
A is
`random(10)`

This library is derived from the DEC10 library random. Later, the core random generator was moved to C. The current version uses the SWI-Prolog arithmetic functions to realise this library. These functions are based on the GMP library.

- [det]
**random**(`-R:float`) - Binds
`R`to a new random float in the*open*interval (0.0,1.0). - [semidet]
**random_between**(`+L:int, +U:int, -R:int`) - Binds
`R`to a random integer in [`L`,`U`] (i.e., including both`L`and`U`). Fails silently if`U``<``L`. - [det]
**random**(`+L:int, +U:int, -R:int`) - [det]
**random**(`+L:float, +U:float, -R:float`) - Generate a random integer or float in a range. If
`L`and`U`are both integers,`R`is a random integer in the half open interval [`L`,`U`). If`L`and`U`are both floats,`R`is a float in the open interval (`L`,`U`).- deprecated
- Please use random/1 for generating a random float and random_between/3 for generating a random integer. Note that random_between/3 includes the upper bound, while this predicate excludes it.

- [det]
**setrand**(`+State`) - [det]
**getrand**(`-State`) - Query/set the state of the random generator. This is intended for
restarting the generator at a known state only. The predicate setrand/1
accepts an opaque term returned by
getrand/1. This term
may be asserted, written and read. The application may not make other
assumptions about this term.
For compatibility reasons with older versions of this library, setrand/1 also accepts a term

`rand(A,B,C)`

, where A, B and C are integers in the range 1..30,000. This argument is used to seed the random generator. Deprecated.- Errors
`existence_error(random_state, _)`

is raised if the underlying infrastructure cannot fetch the random state. This is currently the case if SWI-Prolog is not compiled with the GMP library.- See also
- set_random/1 and random_property/1 provide the SWI-Prolog native implementation.

- [semidet]
**maybe** - Succeed/fail with equal probability (variant of maybe/1).
- [semidet]
**maybe**(`+P`) - Succeed with probability
`P`, fail with probability 1-`P` - [semidet]
**maybe**(`+K, +N`) - Succeed with probability
`K`/`N`(variant of maybe/1) - [semidet]
**random_perm2**(`?A, ?B, ?X, ?Y`) - Does
`X`=`A`,`Y`=`B`or`X`=`B`,`Y`=`A`with equal probability. - [semidet]
**random_member**(`-X, +List:list`) `X`is a random member of`List`. Equivalent to random_between(1,`|`

`List``|`

), followed by nth1/3. Fails of`List`is the empty list.- Compatibility
- Quintus and SICStus libraries.

- [semidet]
**random_select**(`-X, +List, -Rest`) - [det]
**random_select**(`+X, -List, +Rest`) - Randomly select or insert an element. Either
`List`or`Rest`must be a list. Fails if`List`is the empty list.- Compatibility
- Quintus and SICStus libraries.

- [det]
**randset**(`+K:int, +N:int, -S:list(int)`) `S`is a sorted list of`K`unique random integers in the range 1..`N`. Implemented by enumerating 1..`N`and deciding whether or not the number should be part of the set. For example:?- randset(5, 5, S). S = [1, 2, 3, 4, 5]. (always) ?- randset(5, 20, S). S = [2, 7, 10, 19, 20].

- See also
- randseq/3.
- bug
- Slow if
`N`is large and`K`is small.

- [det]
**randseq**(`+K:int, +N:int, -List:list(int)`) - S is a list of
`K`unique random integers in the range 1..`N`. The order is random. Works as if defined by the following code.randseq(K, N, List) :- randset(K, N, Set), random_permutation(Set, List).

- See also
- randset/3.

- [det]
**random_permutation**(`+List, -Permutation`) - [det]
**random_permutation**(`-List, +Permutation`) `Permutation`is a random permutation of`List`. This is intended to process the elements of`List`in random order. The predicate is symmetric.- Errors
- instantiation_error,
`type_error(list, _)`

.