每周在lua中生成随机数(整个星期保持相同的数字)

我正在尝试在lua中生成一个随机的乘数,以便每个新的星期选择一个新的乘数。

例如 第一个星期可能是:1000 * 1.2 下个星期可能是:1000 * 0.8

并且应该来自math.random(0.8,1.2) 但我想整个星期保持随机数字。

我已经能够在php中找到一种方法来做到这一点,但是在尝试在lua中格式化日期时,我找不到解决方法。

我需要ISO-8601周数年和周数。

这个php代码正好做到了这一点:

<?php
mt_srand((int)date'oW')); //本周日期('oW')返回202114
$ number = mt_rand(0.81.2); //从mt_srand以上,即使在重新执行脚本时,它仍将始终在特定周返回1
$ value = 1000 * $ number; 
echo $ value; //当前周返回1000
?>

有没有聪明的人能破解这个?我觉得这是非常有趣的概念。 注:我不想将其存储在数据库中,这也是采用这种方式的原因。

点赞
用户7271221
用户7271221

mt_rand需要一个整数作为参数。如果需要800到1200之间的数字,则可以直接使用这些数字。

一个时间戳被用来测试未来几周的算法。

$weekInFuture = 0;  //0 代表这周,1 代表下周用于测试
mt_srand((int)date('Wo',strtotime("$weekInFuture weeks")));
$value = mt_rand(800, 1200);
echo $value;

这周我得到了1140的数值。未来几周的值为1104、916等。

如果不喜欢这些值,可以在日期中使用“WoW”来生成其他的数值。

2021-04-06 11:40:39
用户1847592
用户1847592
  1. Lua 和 PHP 中的随机数生成器不同。因此,如果你想在 Lua 和 PHP 中生成相同的随机数,你不应该使用库中的标准 RNG。相反,你应该手动编写这样的生成器并在 Lua 和 PHP 上实现。例如,你可以实现公式 1000000000 % YYYYWW * YYYYWW % 401 + 800 来获取范围在 800 到 1200 之间的伪随机数。

  2. 下面是如何在 Lua 5.3+ 上计算 ISO-8601 周数:

function iso_year_week(time)
   -- 返回两个数字:iso_year,iso_week(1-53)
   local t = os.date("*t", time or os.time())
   t.day = t.day + (1 - t.wday) % 7 - 3  -- 最近的星期四
   os.time(t)  -- 规范化所有字段
   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
2021-04-06 12:49:21