Генерация случайного числа каждую неделю в 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')); //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. Просто разделите это на 7.

Egor Skriptunoff 06.04.2021 12:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
61
2

Ответы 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» для даты.

  1. Генераторы случайных чисел в Lua и PHP разные. Итак, если вы хотите сгенерировать одно и то же случайное число как на Lua, так и на PHP, вам не следует использовать стандартный RNG из библиотеки. Вместо этого вы должны написать такой генератор вручную и реализовать его на Lua и PHP. Например, вы можете реализовать формулу
    1000000000 % YYYYWW * YYYYWW % 401 + 800
    получить псевдослучайное число в диапазоне от 800 до 1200.

  2. Вот как вы можете рассчитать номер недели 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

Другие вопросы по теме