`

[转]Erlang的random:uniform()函数

 
阅读更多

转载请注明,来自: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()的必要性:



 

  • 大小: 7.2 KB
分享到:
评论

相关推荐

    Erlang入门:构建application练习4(进程link的作用)

    5. 解除链接:如果不再需要`link`,可以使用`unlink/1`函数断开连接,以防止不必要的干扰。 通过"bank2"的例子,我们可以看到`link`如何在Erlang并发系统中提供健壮性和稳定性。它允许开发者构建出能够优雅处理错误...

    Erlang入门:构建application练习2

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。在本教程中,我们将深入探讨如何使用Erlang构建一个名为"Application"的基本应用程序,这在...

    Erlang入门:构建application练习5(监督树)

    Erlang是一种面向并发的、函数式编程语言,特别适合于构建高可用性和容错性的分布式系统。在Erlang中,"应用"(application)是组织代码的基本单元,它包含了模块、配置文件以及启动和停止应用程序的逻辑。在这个...

    编写分布式的Erlang程序:陷阱和对策

    ### 编写分布式的Erlang程序:陷阱和对策 #### 摘要与背景 在探讨编写分布式的Erlang程序时,本篇文章聚焦于Erlang编程语言中的分布式特性,尤其是那些容易忽视的陷阱及其对应的解决方案。Erlang作为一种专为构建...

    erlang-random:生成Erlang分布随机变量

    Erlang随机变量 ... 如果未提供dims参数,则该函数从Erlang分布返回一个随机抽奖。 var out ; // Set seed random . seed = 2 ; out = random ( 5 ) ; // returns [ ~1.416, ~1.285, ~0.112, ~1.103, ~2.01

    erlang-23.2.1-1.el7.x86-64.rpm

    Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...

    erlang lib of iconv

    在Erlang中使用iconv库,你需要了解以下几个关键函数: 1. `iconv_open/2`: 这个函数用于打开一个转换描述符,它接受两个参数,分别是要转换到的目标编码和源编码。返回的描述符可以在后续的转换操作中使用。 2. `...

    Erlang list用法

    在Erlang中,列表是一种基本的数据结构,提供了丰富的操作函数。以下是对标题和描述中提到的Erlang列表函数的详细解释: 1. `all/2`:这个函数用于检查列表`List`中的所有元素是否满足给定的函数`Pred`。如果每个...

    《Erlang之父:为什么面向对象很糟糕》PDF

    《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF

    Erlang:并行计算和云计算

    **Erlang: 并行计算与云计算** Erlang是一种动态类型的函数式编程语言,由爱立信在1986年为电话交换系统设计,后来因其在处理并发、分布式和容错性上的优秀特性,逐渐在并行计算和云计算领域崭露头角。 ### 1. ...

    erlang文献及资料汇总

    erlang文献及资料汇总 入门资料: erlang中文手册(R11B 文档译文,最适合入门) erlang位运算与二进制解析 erlang二进制高效编程 erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 ...

    erlang最新api

    STDLIB是Erlang的一个核心模块,包含了各种通用的函数库,如列表操作、字符串处理、文件系统交互等。它为开发者提供了一个全面而强大的工具箱,使得编写高效可靠的Erlang程序变得更加容易。根据文档,STDLIB 1.17.4...

    erlang资源

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入...

    Centos7安装RabbitMQ的文档和安装包(包含erlang安装包).rar

    RabbitMQ基于Erlang编程语言,因此在安装RabbitMQ之前,我们需要先安装Erlang环境。本文将涵盖以下几个关键知识点: 1. **Erlang安装**: Erlang是RabbitMQ的基础,因为RabbitMQ是用Erlang编写的。首先,我们需要...

    erlang programming

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在“erlang programming”这个主题下,我们可以深入探讨以下几个关键知识点: 1. **Erlang语言基础**:Erlang是瑞典...

    Erlang初学:Erlang的一些特点和个人理解总结

    首先,Erlang是基于函数式编程范式的语言,这意味着它使用了数学中的函数概念,每个函数都有返回值,并且在Erlang中没有显式的return语句。函数式编程的另外一个特点是不变性,也就是所有的函数参数和变量在函数被...

    erlang-mgf:Erlang分布矩生成函数(MGF)

    分布矩生成函数(MGF)。 随机变量的为 对于t < lambda> 0是分布的速率参数。 在t >= lambda的情况下,未定义MGF,并且此模块返回NaN 。 安装 $ npm install distributions-erlang-mgf 要在浏览器中使用,请使用...

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、容错性和可扩展性的分布式系统。OTP则是Erlang生态系统的核心组成部分,提供了大量的库和设计模式,旨在简化并发、错误处理和系统管理。 ...

    图书:Erlang和OTP实战

    Erlang是一种函数式编程语言,最初由爱立信公司为电话交换系统设计,因其在处理大量并发连接和实时通信方面的优秀性能而受到广泛关注。它的主要特点包括轻量级进程、消息传递模型以及热代码升级机制。这些特性使得...

    erlang编程 Introducing Erlang

    Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心...

Global site tag (gtag.js) - Google Analytics