美文网首页诗翔的R语言学习之路Cook R数据科学与R语言
【r<-方案|统计】保存随机数生成器的状态

【r<-方案|统计】保存随机数生成器的状态

作者: 王诗翔 | 来源:发表于2017-09-07 15:38 被阅读70次

问题

你想要保存和恢复随机数生成器的状态。

方案

.Random.seed保存到其他变量,之后将变量值赋给.Random.seed从而恢复原来的值。

# 这个例子中,先设定随机数种子
set.seed(423)
runif(3)
#> [1] 0.1089715 0.5973455 0.9726307

# 保存种子
oldseed <- .Random.seed

runif(3)
#> [1] 0.7973768 0.2278427 0.5189830

# 做其他随机数生成相关的事情,比如:
# runif(30)
# ...
# 恢复种子
.Random.seed <- oldseed

# 保存种子之后,像之前那样得到相同的随机数
runif(3)
#> [1] 0.7973768 0.2278427 0.5189830

如果你之前还没有在R线程中用过随机数生成器,变量.Random.seed将会不存在。如果你对此不确定,应当在保存和恢复之前进行检查:

oldseed <- NULL
if (exists(".Random.seed"))
    oldseed <- .Random.seed

# 做一些随机数生成操作,比如:
# runif(30)
# ...

if (!is.null(oldseed))
    .Random.seed <- oldseed

在函数中保存和恢复随机数生成器的状态

如果你试图在函数中通过使用 .Random.seed <- x来恢复随机数生成器的状态,结果是行不通的,因为这个操作改变的是名为.Random.seed的本地变量,而不是全局环境中的这个变量。

这里有两个例子。这些函数想要做的是生成一些随机数,并使得随机数生成器保留未改变的状态。

# 这是个坏的版本
bad_rand_restore <- function() {
    if (exists(".Random.seed"))
        oldseed <- .Random.seed
    else
        oldseed <- NULL

    print(runif(3))

    if (!is.null(oldseed))
        .Random.seed <- oldseed
    else
        rm(".Random.seed")
}


# 这是个好的版本
rand_restore <- function() {
    if (exists(".Random.seed", .GlobalEnv))
        oldseed <- .GlobalEnv$.Random.seed
    else
        oldseed <- NULL

    print(runif(3))

    if (!is.null(oldseed)) 
        .GlobalEnv$.Random.seed <- oldseed
    else
        rm(".Random.seed", envir = .GlobalEnv)
}


# 坏的版本没有合适地重置随机数生成器状态,因此随机数一直在改变
set.seed(423)
bad_rand_restore()
#> [1] 0.1089715 0.5973455 0.9726307
bad_rand_restore()
#> [1] 0.7973768 0.2278427 0.5189830
bad_rand_restore()
#> [1] 0.6929255 0.8104453 0.1019465

# 好的版本每次都正确地重置了随机数生成器的状态,因此随机数可以保持一致
# stay the same.
set.seed(423)
rand_restore()
#> [1] 0.1089715 0.5973455 0.9726307
rand_restore()
#> [1] 0.1089715 0.5973455 0.9726307
rand_restore()
#> [1] 0.1089715 0.5973455 0.9726307

注意

使用者最好不要修改.Random.seed 变量。

相关文章

  • 【r<-方案|统计】保存随机数生成器的状态

    问题 你想要保存和恢复随机数生成器的状态。 方案 将.Random.seed保存到其他变量,之后将变量值赋给.Ra...

  • 无处不在的随机数

    目录: 什么是随机数 随机数分类 伪随机数生成器 真随机数生成器 各种语言中的随机数 使用系统时间作为种子是否安全...

  • 游戏编程中的人工智能技术

    一个随机数生成器 math_BullardGenerator 另一个随机数生成器 cv::RNG

  • Python 生成器-generator

    生成器的概念 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到Stop...

  • 在以太坊生成随机数的几种方式(含代码)

    一、什么是随机数 随机数都是由随机数生成器(Random Number Generator)生成的。随机数分为”真...

  • 多线程环境下生成随机数

    生成伪随机数据 Java里有伪随机型和安全型两种随机数生成器。伪随机生成器根据特定公式将seed转换成新的伪随机数...

  • CPP语法笔记

    随机数生成器 随机数生成器能随机生成0~RAND_MAX之间的整型数,包括0和RAND_MAX。RAND_MAX是...

  • 随机数产生转换(1~5到1~7)

    题目给定一个随机数生成器,这个生成器能均匀生成1到5(1,5)的随机数,如何使用这个生成器生成均匀分布的1到7(1...

  • Python——生成器(2)

    生成器是一种特殊的迭代器,它不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到...

  • Java 常用类 09. Java Random 类

    简介:生成随机数 构造方法:Random(); 创建一个新的随机数生成器。Random(long seed); 使...

网友评论

    本文标题:【r<-方案|统计】保存随机数生成器的状态

    本文链接:https://www.haomeiwen.com/subject/elpijxtx.html