问题描述
我正在尝试在 lua 中生成一个随机乘数,因此每个新周都会选择一个新的乘数。
例如 第一周可能是:1000 * 1.2 下周可能是:1000 * 0.8
并且应该来自 math.random(0.8,1.2) 但我想保留整周的随机数。
我已经能够在 PHP 中找到一种方法来做到这一点,但是当我尝试在 lua 中格式化日期时,我找不到解决方法。
我需要 ISO-8601 周编号年份和周编号。
<?PHP
mt_srand((int)date('oW')); //this week date('oW') returns 202114
$number = mt_rand(0.8,1.2); //from the mt_srand above it will always return 1 on this specific week,even if the script is re-executed
$value = 1000 * $number;
echo $value; //current week returns 1000
?>
有没有聪明人可以破解这个?我觉得这是一个非常有趣的概念。 注意:我不想将它存储在数据库中,这就是这样做的原因。
解决方法
-
Lua 和 PHP 中的随机数生成器是不同的。因此,如果您想在 Lua 和 PHP 上生成相同的随机数,则不应使用库中的标准 RNG。你应该手动编写这样的生成器,并在 Lua 和 PHP 上实现它。
例如,您可以实现公式1000000000 % YYYYWW * YYYYWW % 401 + 800
得到800到1200范围内的伪随机数。 -
这是在 Lua 5.3+ 上计算 ISO-8601 周数的方法:
function iso_year_week(time)
-- returns two numbers: iso_year,iso_week (1-53)
local t = os.date("*t",time or os.time())
t.day = t.day + (1 - t.wday) % 7 - 3 -- nearest Thursday
os.time(t) -- normalize all the fields
return t.year,math.ceil(t.yday / 7)
end
function get_YYYYWW_number(time)
return tonumber(string.format("%04d%02d",iso_year_week(time)))
end
,
mt_rand 接受一个整数作为参数。如果需要800到1200之间的值,可以直接使用。
时间戳用于测试未来几周的算法。
$weekInFuture = 0; //0 this week,1 next week for test
mt_srand((int)date('Wo',strtotime("$weekInFuture weeks")));
$value = mt_rand(800,1200);
echo $value;
本周我得到的值是 1140。接下来的几周是 1104、916 ..
如果您不喜欢这些值,如果您使用“WoW”作为日期,您可以生成其他值。