我正在尝试使用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来产生不同的随机数。原谅我,如果有一个简单的解决方案,但我的头脑试图找到答案失败了。干杯:)
答案 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_Seed
中uni_num
的第一次分配也可能在功能体环境中。
请注意,函数写入全局环境是不好的形式。总有一种更好的方式。但这适用于您的示例代码。