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

Posted

技术标签:

【中文标题】每周在lua中生成随机数(整周保持相同的数字)【英文标题】:Generating random number each week in lua (keeping the same number for the whole week) 【发布时间】:2021-07-02 02:18:49 【问题描述】:

我正在尝试在 lua 中生成一个随机乘数,因此每个新的一周都会选择一个新的乘数。

例如 第一周可能是:1000 * 1.2 下周可能是:1000 * 0.8

并且应该来自 math.random(0.8,1.2) 但我想将随机数保留一整周。

我已经能够找到一种在 php 中执行此操作的方法,但是当尝试在 lua 中格式化日期时,我找不到解决方法。

我需要 ISO-8601 周编号年份和周编号。

这个 php 代码正是这样做的:

<?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 中,您可以获取年初的当前日期os.date"*t".yday(今天返回96)。我希望你能在 php.ini 中得到相同的数字。只需将其除以 7。 【参考方案1】:

    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

【讨论】:

【参考方案2】:

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”作为日期来生成其他值。

【讨论】:

以上是关于每周在lua中生成随机数(整周保持相同的数字)的主要内容,如果未能解决你的问题,请参考以下文章

无法在Python中生成不同的随机数

在Objective-C中生成唯一数字的随机数?

在 R 中生成具有相同数量节点和关系的多个随机图?

在java中生成随机静态最终数字

在 Ms. Access 中生成随机字母数字密钥

在 Access 中生成随机字母数字字符串后检查重复项