Массив сортировки Javascript с использованием дня месяца

Я хочу изменить порядок строки в зависимости от того, какой день месяца.

Например, произнесите слово «ПИЦЦА», 1 мая это будет «ZZSIPA», а 2 мая это будет «APIZZS» и т. д.

Код, который я запускаю, работает для Math.random(), однако, когда я присваиваю ему значение дня месяца, оно не меняется.

    const dayOfMonth = new Date().getDate();

function shuffle(s) {
    
  var arr = s.split(''); 

for (let i = arr.length -1; i > 0; i--) {
  let j = Math.floor(dayOfMonth * i)
  let k = arr[i]
  arr[i] = arr[j]
  arr[j] = k
}
    
  s = arr.join(''); 
  return s; // Return shuffled string
    
}
var s = shuffle("PIZZAS");
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
0
35
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Math.random() возвращает число с плавающей точкой от 0 до 1, new Date().getDate() возвращает целое число от 1 до 31, поэтому, если вы хотите получить такое же поведение, вы должны разделить день месяца на 31.

Но обратите внимание, что этот генератор псевдослучайных чисел не очень хорош, и вы, вероятно, получите менее предсказуемые результаты с чем-то из вопрос о посеве генератора случайных чисел JS.

Что не так с Math.random()? Кроме того, что я не могу раздать его, я никогда ничего не слышал об этом плохой

J-Cake 10.04.2022 14:18

@ J-Cake, хорошо, вопрос в том, чтобы засеять RNG текущим днем ​​​​месяца, не так ли?

Samuel Olekšák 10.04.2022 14:22

Думал, вы имели в виду сам ГСЧ :/

J-Cake 10.04.2022 14:23

Да, поэтому мне по существу нужен 31 разный порядок массива

Sam 10.04.2022 14:23

Используя «Math.sin(dayOfMonth++) * 10000», проблема решена.

var dayOfMonth = new Date().getDate();

function random() {
    var x = Math.sin(dayOfMonth++) * 10000;
    return x - Math.floor(x);
}

function shuffle(s) {
    
  var arr = s.split(''); 

for (let i = arr.length -1; i > 0; i--) {
  let j = Math.floor(random() * i)
  let k = arr[i]
  arr[i] = arr[j]
  arr[j] = k
}
    
  s = arr.join(''); 
  return s; // Return shuffled string
    
}
var s = shuffle("PIZZAS");

Ваша перетасовка не удалась, потому что вы меняете undefined.

Я отладил ваш код, реализация функции shuffle(s) осталась неизменной.

А shuffle_new(s) решит проблему замены undefined с помощью модульный оператор: let j = Math.floor(dayOfMonth * i) % arr.length, чтобы arr[j] никогда не возвращал значение undefined.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shuffle Demo</title>
</head>

<body>
    <script>
        const writeln = (text = '') => document.writeln(text + '<br/>');
    </script>
    <script>
        const dayOfMonth = new Date().getDate();

        function shuffle(s) {
            var arr = s.split('');
            for (let i = arr.length - 1; i >= 0; i--) {
                writeln();
                let j = Math.floor(dayOfMonth * i)
                writeln('j:' + j);
                let k = arr[i]
                writeln('k:' + k);
                arr[i] = arr[j]
                writeln('arr[j]:' + arr[j]);
                arr[j] = k
                writeln('arr:' + arr);
            }

            s = arr.join('');
            return s; // Return shuffled string

        }

        function shuffle_new(s) {
            var arr = s.split('');
            for (let i = arr.length - 1; i >= 0; i--) {
                writeln();
                let j = Math.floor(dayOfMonth * i) % arr.length
                writeln('j:' + j);
                let k = arr[i]
                writeln('k:' + k);
                arr[i] = arr[j]
                writeln('arr[j]:' + arr[j]);
                arr[j] = k
                writeln('arr:' + arr);
            }

            s = arr.join('');
            return s; // Return shuffled string
        }

        writeln('dayOfMonth:' + dayOfMonth);
        writeln('process: shuffle("PIZZAS")');
        var s = shuffle("PIZZAS");
        writeln('output:' + s);

        writeln();
        writeln();
        writeln();
        writeln();
        writeln('process: shuffle_new("PIZZAS")');
        var s = shuffle_new("PIZZAS");
        writeln('output:' + s);
    </script>
</body>

</html>

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