转载请注明,来自:http://blog.csdn.net/skyman_2001
看它的代码实现:
uniform() -> {A1, A2, A3} = case get(random_seed) of undefined -> seed0(); Tuple -> Tuple end, B1 = (A1*171) rem 30269, B2 = (A2*172) rem 30307, B3 = (A3*170) rem 30323, put(random_seed, {B1,B2,B3}), R = A1/30269 + A2/30307 + A3/30323, R - trunc(R).
每次调用会更新进程字典里的random_seed变量,这样在同一个进程内每次调用random:uniform()时,随机数种子都不同,所以生成的随机数都不一样(调用完random:uniform()后,可以用get(random_seed)查看更新后的种子值)。
但是如果是不同的进程分别调用random:uniform(),因为随机种子更新的算法是一样的,所以每次各进程的随机数种子也是相同的,从而生成的随机数也是一样的,要想让不同进程生成的随机数不同,要手动为每个进程设置不同的种子,常用的是用erlang:now,比如:
random:seed(erlang:now()), random:uniform().
不过如果每个进程调用random:seed(erlang:now())太接近,种子值会比较接近,生成的随机数也会比较接近,更好的方法是用一个单独的进程来生成种子,保证每次的种子值相差比较大:
Seed = {random:uniform(99999), random:uniform(999999), random:uniform(999999)}
然后每次调用random:uniform()前从该种子生成进程获取最新的种子值,seed()之。
以上是转截
下面来一张图 说明一下在新的进程中调用一下random:seed()的必要性:
相关推荐
这个小程序可能使用了`rand:uniform()`函数来生成0到1之间的一个浮点数,然后通过适当转换得到1到33之间的整数,对应双色球的红球部分。蓝球部分可能使用了类似的方法,但范围缩小到1到16之间。 2. **链表连接**: ...
case random:uniform() true -> L2 = random_ind(P), {Lc1, Lc2} = one_point_crossover(L1, L2), crossover(P, Pc, [Lc2 | [Lc1 | NewP]], Count - 2); false -> crossover(P, Pc, [L1 | NewP], Count - 1) ...
% 'uniform' Uniform random numbers in the interval (A, B). % The default values are (0, 1). % 'gaussian' Gaussian random numbers with mean A and standard % deviation B. The default values are A = 0, ...
- `$dist_erlang`:产生一个埃尔朗分布的随机数。 - `$dist_exponential`:产生一个指数分布的随机数。 - `$dist_normal`:产生一个正态分布的随机数。 - `$dist_poisson`:产生一个泊松分布的随机数。 - `$dist_t`...
- **$dist_erlang**:埃尔朗分布。 - **$dist_exponential**:指数分布。 - **$dist_normal**:正态分布。 - **$dist_poisson**:泊松分布。 - **$dist_t**:t分布。 - **$dist_uniform**:均匀分布。 以上内容覆盖...
Elixir,一种基于Erlang虚拟机的函数式编程语言,以其并发能力、可扩展性和简洁的语法,成为了实现生命游戏的理想选择。 首先,我们要理解康威生命游戏的基本规则: 1. **出生规则**:如果一个细胞周围有3个活细胞...