# Difference between revisions of "Random Numbers"

From ErlangCentral Wiki

m (random:uniform/1 never returns 0) |
|||

(2 intermediate revisions by 2 users not shown) | |||

Line 5: | Line 5: | ||

== Solution == | == Solution == | ||

− | Use random:uniform | + | Use random:uniform/0 and random:uniform/1 ; the first returns a random float uniformly distributed between [0.0,1.1], and the second returns a random integer uniformly distributed between [1,N]. |

<code> | <code> | ||

1> random:uniform(). | 1> random:uniform(). | ||

− | + | 0.159112 | |

2> random:uniform(150). | 2> random:uniform(150). | ||

67 | 67 | ||

</code> | </code> | ||

− | + | To select random integers from [N,M], can use N+random:uniform(M-N). | |

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | A common example is generating a random password: | |

<code> | <code> | ||

− | + | generate_password(N) -> | |

− | lists: | + | lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)). |

− | + | ||

− | + | ||

− | + | 3> generate_password(8). | |

− | " | + | "l?8j#$&&" |

− | + | 4> generate_password(8). | |

− | " | + | "V<bFi(EW" |

− | + | 5> generate_password(8). | |

− | + | "irp^DXTz" | |

− | + | ||

− | " | + | |

</code> | </code> | ||

Line 77: | Line 32: | ||

It can support bigint values, so no special recipe is required for extremely large random numbers. | It can support bigint values, so no special recipe is required for extremely large random numbers. | ||

− | [[Category:CookBook]] | + | [[Category:CookBook]][[Category:NumberRecipes]] |

## Revision as of 07:32, 24 March 2009

## Problem

You want a random number from a given range. For example, you wish to randomly select one element from an array, simulate rolling a die in a game of chance, or generate a random password.

## Solution

Use random:uniform/0 and random:uniform/1 ; the first returns a random float uniformly distributed between [0.0,1.1], and the second returns a random integer uniformly distributed between [1,N].

1> random:uniform(). 0.159112 2> random:uniform(150). 67

To select random integers from [N,M], can use N+random:uniform(M-N).

A common example is generating a random password:

generate_password(N) -> lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)). 3> generate_password(8). "l?8j#$&&" 4> generate_password(8). "V<bFi(EW" 5> generate_password(8). "irp^DXTz"

The Erlang random number generator is attributed to B.A. Wichmann and I.D.Hill, in 'An efficient and portable pseudo-random number generator', Journal of Applied Statistics. AS183. 1982. Also Byte March 1987.

It can support bigint values, so no special recipe is required for extremely large random numbers.