Я пытаюсь сгенерировать случайный множитель в 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
?>
Есть ли какие-нибудь умные люди, которые могут это взломать? Я считаю это очень интересной концепцией. Примечание: я не хочу хранить его в базе данных, поэтому я делаю это таким образом.






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 и PHP разные. Итак, если вы хотите сгенерировать одно и то же случайное число как на Lua, так и на PHP, вам не следует использовать стандартный RNG из библиотеки. Вместо этого вы должны написать такой генератор вручную и реализовать его на Lua и PHP.
Например, вы можете реализовать формулу 1000000000 % YYYYWW * YYYYWW % 401 + 800
получить псевдослучайное число в диапазоне от 800 до 1200.
Вот как вы можете рассчитать номер недели ISO-8601 на Lua 5.3+:
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
В Lua можно получить текущий день с начала года
os.date"*t".yday(сегодня возвращает96). Надеюсь, вы сможете получить такой же номер в php. Просто разделите это на 7.