在R中使用自定义函数每次都产生不同的随机数

时间:2014-02-14 23:43:54

标签: r


我正在尝试使用Lehmar随机数生成器生成不同的统一数字。我相信我已经这样做但每次执行此功能时都会产生不同数字的问题。下面是我要做的代码,我将在下面进一步解释这个问题。

            MODULUS <- 2147483647
            MULTIPLIER <- 48271

            put_Seed <- function(x)
            {
              x <- (if ( x > 0)
              {
                x%%MODULUS
              }
              else
              {
                1000*as.numeric(Sys.time())
              }
              )
            }

            T_val <- function(Rand)
            {
              Q <- floor(MODULUS / MULTIPLIER)
              R <- MODULUS%%MULTIPLIER;  

              floor(MULTIPLIER*(Rand%%Q) - R*(Rand/Q))
            }  

            New_Random_Seed <- function(T_value_i)
            {
              Random_Seed <- (if (T_value_i > 0)
              {
                T_value_i;
              }
              else
              {
                T_value_i + MODULUS
              })
            }

            Random <- function(New_Seed)
            {
              New_Seed/MODULUS
            }

            uniform_num <- function(a, b, r)
            {
              a + (b - a) * r
            }

            Random_Seed <- put_Seed(123456789)

            uni_num <- function(k)
            {

              Random_Seed <- put_Seed(k)
              T_value <- T_val(Random_Seed)
              Random_Seed <- New_Random_Seed(T_value)
              uniform_num(0, 1, Random(Random_Seed))

            }

            test1 <- uni_num(Random_Seed)
            test2 <- uni_num(Random_Seed)
            test3 <- uni_num(Random_Seed)

#Results
    #test1 = 0.05380306
    #test2 = 0.05380306
    #test3 = 0.05380306


我想要做的是每当我运行uni_num函数时,每次更新Random_Seed并且uniform_num(0,1,Random(Random_Seed))行在每次执行函数时产生0到1之间的随机统一数字。该代码适用于1次重复,但如果我再次尝试使用该函数,则Random_Seed尚未更新,因此该函数将生成与之前相同的随机数。这是不希望的,因为我希望每次通过在每次重复之后更新Random_Seed来产生不同的随机数。原谅我,如果有一个简单的解决方案,但我的头脑试图找到答案失败了。干杯:)

1 个答案:

答案 0 :(得分:1)

在此功能中:

        uni_num <- function(k)
        {

          Random_Seed <- put_Seed(k)
          T_value <- T_val(Random_Seed)
          Random_Seed <- New_Random_Seed(T_value)
          uniform_num(0, 1, Random(Random_Seed))

        }

赋值Random_Seed <-的目标位于函数体的环境中,而不是全局环境。因此,当您进行第二次调用时,全局环境中的Random_Seed尚未修改,您将获得相同的结果。

要写入全局环境,请使用<<-

Random_Seed <<- New_Random_Seed(T_value)

看起来这是唯一必须修改的赋值,因为New_Random_Seed返回一个值而不需要修改此全局对象。此外,Random_Seeduni_num的第一次分配也可能在功能体环境中。

请注意,函数写入全局环境是不好的形式。总有一种更好的方式。但这适用于您的示例代码。